2018山東省賽回憶與總結
標籤: ACM省賽 總結ios
真的沒想到會打得這麼爛。算法
比勝過程
開場前咱們就決定好隊長看a-d,田大佬看e-g,而我看h-j。 開場以後,我看了h,i並無想到思路,而後j題尚未看懂題意,隊長就過掉了c。而後田大腿告訴我f題可作,並且當時有三四個隊已通過掉了。我看了下題意就去寫容斥了,而後差很少二十分鐘才寫完並wa了一發。隊友說a能夠寫了,因而我打印了f代碼去一邊找bug,發現運算過程當中有些地方忘記取模可能會致使溢出,算法也存在一些問題,而隊友則很快過掉了a題。我又回來寫F,把算法改正,也修正了不少細節,造了一組比較強的樣例也沒有卡掉個人程序,自信滿滿的交上去又wa了。隊友猜想多是運算過程當中取模以後出現負數,而後再減去一個接近MOD的值會爆long long,而後我就把全部運算都加上了強制轉換__int128,又wa了一發。 這個時候咱們三個心態都有點崩,已經開場兩個多小時,才只過掉兩題,而奕神的隊已經五題在冠軍位置領榜。我以爲多是我寫崩了,讓隊長從新寫一次f,本身去找別的題。首先是博弈的題,想了一下dp又感受數據範圍太大不可行。而後沒找到其餘可作題,我又開始想f問題出在哪裏(由於當時除了a、c,F是過題人數最多的)。隊長寫f也寫崩了幾回,後來交上去也wa掉了,好像後來又折騰幾回仍是沒過。我上去找我寫的f的bug,我對算法很自信,以爲只會是細節的問題。 中途找bug期間,隊友跟我說了e題也有不少人過了,而後我看了下題意,提出了一些想法可是不知道怎麼實現,隊友說能夠維護前綴最小和次小值,而後我以爲很靠譜,暫時棄掉f一發過了e。以後就是咱們輪流上來找f的bug。後來我說f題可能數據有問題,可是其餘不少隊都過了又不是很肯定有問題。隊長終於決定要打表找bug,這個時候大概還有不到兩小時就結束了,我把打表的活甩給隊長以後去看別的題了。 而後立馬就發現,以前博弈題的數據範圍看錯了//汗,而後立馬推出了dp的狀態和方程,趁着隊長打表想好了每一步具體怎麼寫。而後感受很穩了就去寫了博弈也就是g題,一發過了。 過掉e和g的人數比f少不少。我開始懷疑這個題是否是有除了容斥以外的抖機靈算法。然而雖然想到了可是感受實現很麻煩,因此也沒有寫。隊長提出用打表程序對拍找錯,咱們在表裏選了一些感受比較難算對的數據,結果個人程序都經過了。而後隊長索性用程序對拍了十萬的數據,結果仍是隻證實了個人程序的正確性。 比賽還剩下不到一個小時,我跟隊友說f的數據確定有問題,比賽完了我要黑了這個題。只作了四題的咱們必須再搞一個才能拿金。隊友說應該繼續作f,但我以爲應該開b,大概想了差很少十分鐘b題,咱們認爲應該二分答案,而後每次二分求一個最大殺戮數,可是就是沒有想到怎麼求這個最大殺戮數,只要解決了這個問題這個題就很穩了。隊友感受b無望以後繼續想f,我偷偷想b題,然而並無想出來,比賽完了問奕神說是用二分圖最大匹配求,恍然大悟。就這樣最後一個小時也用沒了。 最後兩分鐘,我把F代碼打印了出來。spa
比賽中的問題
我以爲打這麼爛有下面幾個方面的緣由code
1. 實力不夠
- 首先是實力上的。比賽完奕神告訴我b題是用二分圖最大匹配寫時,我想到好久以前exam上貪心專題有一個題跟這個題很相似,然而當時沒有學會二分圖沒作出來,後來也不了了之。最近一個月的組隊訓練賽,也有兩次用到二分圖的匹配算法,一般都是尚未學會又要開始補新一場訓練賽的題了。並且山大有一支隊伍全程沒有搞f也仍是拿到了7題
2. 過於緊張
- 其次是比勝過程中沒控制住心態。一開始寫F犯各類低級錯誤,後來時間剩一個多小時時,仍是着急的只想搞出F,我以爲是由於緊張失去了作出正確選擇的能力。
3. 不敢敢於開新題
- 事實上當比賽結束後我也還有不少題不知道題意包括D,而從他們的討論中我知道D是能夠用樹鏈剖分寫的(聽說不用樹剖暴力也能夠過),若是能把搞F的時間拿出來一點來寫D也不會結局這麼慘。在之後的比賽中,無論有沒有在卡題,三我的都應該把全部有人過的題看一遍,思考下思路。
4. 平時訓練
- 首先是訓練中留下的一些坑沒有及時填掉,因此失去了B題。
- 訓練後補題時我老是會花不少時間在尚未人補出來的題上,有時候雖然補出來了可是收穫可能不值花這麼多的時間
- 訓練賽中有些隊友作出來的題,賽後就懶得去補一下。其實這種題有隊友教反而收穫會更大。
- 平常訓練太放鬆了,沒有正式比賽時的緊張感
4. 策略問題
- 此次栽在了F上,由於F簡單且過的人多因此咱們更願意花時間去搞。下次即便遇到這種簡單的過的人多的題,一旦花費時間超過40分鐘就應該果斷開新題,由於不能排除是數據有問題。(跟好多人說了我要黑了這個題,結果後來才知道F根本沒數據
當初省賽報名後不久,我收到郵件老師要讓咱們隊去參加江蘇省賽。比賽完問樂神才知道只派了奕神隊和咱們隊,真的對不起老師的指望,我難受的飯吃不下去。不管如何下個月江蘇省賽也要打的像個樣子。io
語言混亂,表達不清,還請海涵。class
<details> <summary> 當時的f代碼 </summary> ```cpp #include <iostream> #include <cstdio> using namespace std; typedef long long ll; const ll MOD=1e9+7; ll f(ll a,ll b,ll c,ll d){ ll l=max(a,c),r=min(b,d); ll ans=r-l+1; if(ans<0) return 0; return ans; } ll min(ll a,ll b,ll c){ return min(a,min(b,c)); } ll max(ll a,ll b,ll c){ return max(a,max(b,c)); } int main(int argc, char const *argv[]) { int t; scanf("%d", &t); while(t--){ ll l[5],r[5]; ll sum=1; for (int i = 1; i <= 4; ++i) { scanf("%lld%lld", l+i,r+i); sum=sum*(r[i]-l[i]+1)%MOD; } ll ans=0; ans=(ans + f(l[1],r[1],l[2],r[2])*(r[3]-l[3]+1)%MOD*(r[4]-l[4]+1)%MOD)%MOD; ans=(ans + f(l[2],r[2],l[3],r[3])*(r[1]-l[1]+1)%MOD*(r[4]-l[4]+1)%MOD)%MOD; ans=(ans + f(l[3],r[3],l[4],r[4])*(r[1]-l[1]+1)%MOD*(r[2]-l[2]+1)%MOD)%MOD; ans=(ans + f(l[4],r[4],l[1],r[1])*(r[2]-l[2]+1)%MOD*(r[3]-l[3]+1)%MOD)%MOD;stream
ll crs=min(r[1],r[2],r[3])-max(l[1],l[2],l[3])+1; if(crs<0) crs=0; crs%=MOD; ans=(ans - crs*(r[4]-l[4]+1)%MOD+MOD)%MOD; ll crs2=min(r[3],r[4])-max(l[3],l[4])+1; if(crs2<0) crs2=0; crs2%=MOD; crs=min(r[1],r[2])-max(l[1],l[2])+1; if(crs<0) crs=0; crs%=MOD; ans=(ans - crs*crs2%MOD+MOD)%MOD; crs=min(r[1],r[2],r[4])-max(l[1],l[2],l[4])+1; if(crs<0) crs=0; crs%=MOD; ans=(ans - crs*(r[3]-l[3]+1)%MOD+MOD)%MOD; crs=min(r[2],r[3],r[4])-max(l[2],l[3],l[4])+1; if(crs<0) crs=0; crs%=MOD; ans=(ans - crs*(r[1]-l[1]+1)%MOD+MOD)%MOD; crs2=min(r[2],r[3])-max(l[2],l[3])+1; if(crs2<0) crs2=0; crs2%=MOD; crs=min(r[1],r[4])-max(l[1],l[4])+1; if(crs<0) crs=0; crs%=MOD; ans=(ans - crs*crs2%MOD+MOD)%MOD; crs=min(r[1],r[3],r[4])-max(l[1],l[3],l[4])+1; if(crs<0) crs=0; crs%=MOD; ans=(ans - crs*(r[2]-l[2]+1)%MOD+MOD)%MOD; ll L=max(l[4],max(l[1],l[2],l[3])),R=min(r[4],min(r[1],r[2],r[3])); crs = R-L+1; if(crs<0) crs=0; crs%=MOD; ans=(ans + 3LL*crs%MOD)%MOD; ans = (sum - ans + MOD)%MOD; cout << ans << endl; }
} // 沒過好像是由於沒有return 0?bug
</details>