1. 程式人生 > >2017山東省ACM省賽總結

2017山東省ACM省賽總結

前言:

    這次省賽是在青島科技大學,57-8號。我們山東建築大學出了4個正式隊參加(隨著每屆省賽的正式名額的增加,我們學校已經沒必要出星花隊了,因為我們實驗室水平能夠參加省賽ACMer光正式隊就夠了-_-|)。

我們是週六(57號)一早6點多和山大的一塊拼車,坐汽車出發去青島。山大可是10個隊呢,滿滿的大神,心裡默默地膜拜了一番(其實幾乎每年打省賽我們學校都會和山大的拼車,所以我參加的這幾次,每次都膜拜一番)。

住的酒店不錯,伙食挺好,下午一塊坐車去嶗山校區參加開幕式和熱身賽。

熱身賽:

原定的下午3點半的熱身賽,因為開幕式2點半就結束了,所以熱身賽也提前了。

來到賽場,我的天,實驗室有點小哦,大概一個賽場能裝的下

20個隊伍吧。開啟電腦,PC^2找不到快捷方式哦,我們3linuxubuntu?)小白傻了眼。就問周圍的隊伍PC^2怎麼開啟,也是有的會有的不會,後來還是志願者用終端給打開了PC方,心裡為明天的正式賽捏了把汗。

拿到題目,一看就3個題,我的天,還是中文的哦,因為提前就打開了PC^2CB,所以題目發下來就直接看題目了,省去了登入PC^2和敲標頭檔案的時間(明天正式賽也是這樣多好啊*_*)。

掃一眼A題,題意之複雜,讓我相信A肯定不是最簡單的。看B題,水題,然後就敲,其實一開始用這裡的鍵盤還是有點不太習慣的,大概3分鐘吧,敲完測試,提交1Y。這時隊友xyb(大一學弟)告訴我C題是水題,直接判斷兩個字串包含的字母和個數是否一樣,我說太簡單了,輸入兩個字串

st,排序,然後strcmp判斷,測試樣例全過,提交,WA啦,哎我去,我習慣性地想到又是大一學弟理解錯題意了或者解法想錯了,然後我就讀一遍題,發現題意是隻能交換一次,所以我就改了改,如果兩個字串如果相等則YES,否則判斷是否是一次正確的交換,敲完提交,又WA,頓時就怒了,這還錯??!!過了幾分鐘發現bug,兩個字元完全相等時,如果每個字母都是唯一也是該是NO才對,修改後提交,3Y。然後我就去找我們學校的其他大一的隊,去教教他們PC^2的使用和測試記憶體和時限。這期間兩個隊友(學弟)一直在討論A題,又是最短路,又是dp的,就讓xyb上去敲。我也不知道他的思路是什麼,然後看到他開了一個int w[maxn][100]
,我就知道他能過這個題或者他的想法是正解的可能性極小。然後我就用Dijkstra的原理看能不能由目前最小的去更新其他點。出去上個廁所順便證明一下其正確性(我們賽前都說好,腦袋有點迷糊的話就去上個廁所清醒清醒),回去之後讓xyb趕緊把他的程式碼提交一下看看什麼結果,對了更好(錯了我就可以敲我的思路了,哈哈哈哈,我是不是很壞),提交果然WA了。然後我就上去按我的思路敲,敲了提交,過了。

然後就是測試記憶體和時限,我們測的2s10^10不超時(不過事實證明這測貌似並不對),然後就把標頭檔案作為CBdefault code儲存起來(不過事實證明這也不行,哈哈哈,大家不要學我們)。

正式賽:

820進賽場,然後看見PC2已經打開了,坐定之後,討論了一下戰術安排,然後就等著比賽開始了。

過了850,志願者開始發題目,我們幾乎是A賽場最後拿到題目的隊伍,接下來驚人的一幕就發生了,大家都開始拆信封!!我的天,我心想著說,這樣不好吧,這麼可以這樣呢,然後對面的隊伍(好像是山東工商學院的)也在拆,我本著不能亂來的原則沒有拆,同時坐在我們右邊的山科的reliant隊伍也沒有拆,他們還說好沒有素質啊(其實我心裡也是這麼想的),然後我就告訴隊友說:山科不拆,我們就不拆!不過我說完山科就開始拆了,那麼我們就也跟著拆了(可能我們是A賽場最後一個拆的,哈哈哈哈)。

題目一人一份,我先登入PC2,然後就看題,賽前安排我是ABCD,隊友(大二學弟)cypEFGHxybIJK,但是看到目錄A題是Return of the Nim,就知道可能是個博弈,然後翻開大眼一掃,沒錯就是博弈了,然後告訴我右邊的cypA是博弈,你去看。同時他告訴我G是水題(其實他是聽到山科的說的,哈哈),我就立馬去看G,真是水題,求1-n每個數的m次冪的和,心想太簡單了,一定會有一個小坑的,然後就仔細數了一下mod,啊哈,是1e8+7,坑被我發現了,這應該會有隊伍會栽一下吧,心裡一陣暗喜,很快把程式碼敲好,測試沒有問題,搞笑的是,現在比賽都還沒有開始(哈哈哈),所以我等著PC2開通,然後打算拿個全場FB,夠我回去吹幾天的了。9PC2準時開通,我立馬選定題目,檔案,提交,然後ID1,我心裡那個激動呀,然後返回一個紅紅WA,臥槽,我心裡那個怕呀,C語言入門級別的題讓我寫錯了,還是全場ID1WA!!刷榜看見也有人交G,但是好像也錯了,我檢查幾遍程式碼發現並沒有錯啊。。。這時戲劇性的一幕發生了,旁邊山科隊的隊員向志願者反應G題該是1e9+7,我偷聽到這立馬改了mod,交上就過了,嘴上還罵了兩句街。然後隊友cyp告訴我I題是水題,我一看是斐波那契,f[n]mod2,其實就是奇偶性嘛,第一反應就想到了有迴圈,然後把斐波那契的前十幾寫出來,發現每6個就有迴圈,然後字串模擬mod 6,直接輸出結果,測試前幾項全對,就交上去了,10分鐘1Y

這時刷榜,我們還是比較靠前的,發現有人過F,正好隊友xyb讀完了F,告訴我題意,就是“對於任意的x,如果a*x^2+b*x+c=0,則x是個整數”,在給定abc,判斷這句話是否成立。然後向隊友問了兩種情況,大概瞭解瞭解法。然後就開敲。這個時候整個比賽中最精彩的一幕發生了,隊友cyp(從一開始就負責看A題的學弟)告訴我:祥哥,A題很難,但是我會,哈哈哈哈……我說真的?他說先找找模板。然後我就接著敲F,敲完,測試樣例全過,提交,WA。然後檢查程式碼發現忘了處理a=0的情況,然後就是又討論了一下,感覺可以了,再次提交,又WA。這時cyp告訴他想敲A,於是我把F題程式碼列印了一下,繼續找bug,而cyp則開始敲A

    (這個過程應該是G題對一部分提交重判了,然後我G題2Y也就變成了1Y,全場FB!)

不一會我發現二次方程如果無解該輸出YES,但是輸出了NO,我就把A題寫到一半的cyp趕下來,我上去改了改,然後提交,44分鐘3Y。就接著讓cyp去敲A。然而他很快就寫完了,給我說:祥哥我寫完了。其實一開始我是不太信A題這麼難他是能做出來的,況且現在榜上並沒有人碰A啊,然後我就問你檢查好了嗎?陣列開小了嗎?爆int了嗎?他說檢查好了,沒用陣列,不會爆int,然後我就給他檢查輸入的名字有沒有打錯,在再三確認無誤下,就讓他去交了,他說如果過了,我們就拿到一血了,然後就返回了一個綠綠的YES,我太佩服他了,48分鐘1Y,並且拿到FB。然後我就鄭重地告訴他:如果這真是個難題,那就可能就帶偏榜了。(事實證明多少有點這個趨勢(斜眼笑)

再次刷榜,我們4題了,到了第3名,感覺這場比賽打的很順啊,要拿金牌的節奏啊。然後我們隊我看了Ccyp看了Dxyb看了J題,cyp告訴我說D題可以10^10複雜度的暴力dp,祥哥你敢不敢寫,然後我就想昨天熱身賽測的速度很快,我就說為啥不敢,然後他們兩個就討論J題,我就去寫D的暴力dp。我先把所以詢問離線,但是10^10的陣列沒法開,但因為每個狀態只受前兩行影響,所以我把第一維滾動了一下,然後就是暴力dp了。寫好之後,樣例不過,然後就是一頓debug,改好之後樣例過了,我就說碰碰運氣我交了,然後提交,半天沒反應就預感會超時,然後結果也是不出意料,返回了TLE。這時J題他們終於討論出了結果,cyp要寫,然後我就讓出了電腦上了廁所,回來之後問xyb J題題意,在得知題意之後,我說,這不是水題嗎,把價值排序,然後從大到小O(n)掃一遍,並記錄字尾和,同時更新答案就可以了啊,為什麼你們討論了那麼久呢。。。然後cyp告訴他就是這麼寫的,然後我還想搶下電腦自己寫,因為我敢保證這是正解啊,然後他說他也是這個思路,沒事的,一定會過的。這我才放心的讓他接著敲了。

果然,沒一會cyp就敲了J題,測試樣例不過,發現一個變數寫錯,修改,然後就可以過了樣例,我就又給他出了一組資料也過了,我就說交吧,這是個水題相信你寫不錯,然後就提交,103分鐘1Y

然後我就接過鍵盤接著改我的D題,我還想再碰碰運氣,看暴力dp能不能過。在cypJ的時候,xyb就一直在看C題。而我在改D題的時候,又精彩的一幕發生了,xyb拿著稿紙對著cyp說:鵬哥,通過這個表你能看出什麼(很嚴肅地說)。Cyp突然就笑了,並對我說:C題我會了祥哥。然後就把稿紙拿給我看,臥槽,這不是楊輝三角嗎!!然後就扔下手裡的D,去寫C

C就是先預處理階乘,然後列舉每一個煙花,如果能炸到w位置,就算它的貢獻,其中求組合數用了Lucas定理,寫好之後測試樣例全過,自己又隨手出了一組樣例也過,就提交了,然後返回一個WA,這明明就是正解,怎麼會WA呢。然後就檢查程式碼,發現nm都比較小,用不著Lucas,就本著越複雜越容易出錯的原則,就把Lucas刪掉了,其實心想就算不用Lucas也可能不對,因為我感覺問題不在這,然後就一行一行的看程式碼。突然就看到了問題,原來是res在累加每一次的答案之後,然後res%=mod了,這肯定會炸,然後就修改,樣例全過,提交,145分鐘2Y。 這時刷榜,我們已經6題了,排在很靠前的位置,金牌應該沒問題,能再出一個題金牌就穩了。這時還才11點半,比賽才進行一半。我們還是有機會出題的。然後我就接著看D,他們兩個去看K了。

我又隨便剪了剪枝,抱著僥倖心理又提交了一次D,還是TLE。然後就徹底放棄了暴力,開始相信這是一個組合數學的題了。我一開始想著從給定的位置一路向上,然後累加過程中的組合數,但是隊友給我否了。我把蜂窩轉換成二維座標,然後把3種轉移方式畫出來。發現去列舉其中的一種轉移方式,然後另外兩種方式不用列舉,而直接用組合數就可以計算,這下就不超時,我相信這是正解,然後就重新寫D

寫完了測試樣例並不過,一直想不明白為什麼會不對。然後不停地的分析每一步,才發現列舉第一個轉移方式時,所算的組合數不對。然後就推了推發現,是另外一種情況。但是這種情況我一時半會想不到解法,只要高複雜度的dp能解,但是複雜度太高,肯定超時啊,這時就封榜了。我向兩個學弟求助,說幫我解決了這個問題我就能過了D題,可是他們兩個討論半天無果,cyp說他想打個表來找規律,然後我就把鍵盤讓給他了,我去旁邊繼續推公式。

我轉換思路突然就想到了解法,這時cyp的打表程式都還沒寫完就被我攆下去了,然後我就在我原來的程式碼上改了改。測試前面的好多組資料都對,然後我就提交了,然後返回了一個綠綠的YES248分鐘3Y。這下金牌穩了。Cyp問我,祥哥,咱接下來幹啥,我就說吃飯啊,哈哈哈。

最後揭榜,7題,除去星花隊,我們排名第5,創造了我們學校的歷史最好成績,拿到了我們學校的第一塊省賽金牌。

賽後開會,才發現我們的成績都是在教練劉老師的預料之內,都說劉老師的嘴是開過光的,看來一點都不假,哈哈哈哈

    出了賽場,遇到了山理工的教練劉曉紅劉老師,追上去給老師打了個招呼,和劉老師聊了會天(因為考研的事,機緣巧合地讓我接觸到了劉老師),感覺劉老師好和藹啊,好親切呀有沒有,對山理工今年沒能拿到金牌表示挺遺憾的,不過相信他們明年拿金是一定沒有問題的。然後閉幕式之後還有機會和劉老師合了影,心裡真激動。這次比賽我收穫的很多,取得首塊金牌,有這麼好的隊友,和一群可愛的學弟學妹,收穫和劉曉紅老師,還有教練劉毅老師和帶隊老師的滿滿的師生情。

回來學校的第二天,我看到了K題,才發現K是個水題,我以前在bc上做過的,不用20分鐘我就可以過掉它。。。。。。我好後悔最後50分鐘沒有看K題。。。如果我出了K題,我們就是季軍呀,這是一個我想都不敢想的高度,而我,就是與它擦肩而過,我對不起我的隊友,對不起劉老師的叮囑,對不起學校,也對不起ACM比賽,我沒有把比賽堅持到最後,對不起的是ACM比賽精神。

我告訴劉老師,這在我心裡是個坎,可能永遠也過不去。

為了證明我不是事後諸葛亮,現在貼出和K題幾乎原題的題目連線:HDU5501


總結:

    我們能取得這樣的成績,當然運氣也是好了點,但是不得不說我們每出的一道題,都是我們能力範圍內的(甚至包括沒有出的K題也是能力範圍內的,只是戰略出了點問題),去年我和另外兩個隊友參加省賽,信誓旦旦地要拿金,最終只拿到了銀。今年換成我一個大四狗帶兩個小學弟參加,或許是我又多了一年的沉澱,多了一份沉重吧,今年沒卡題,心態也沒出現問題,耗我時間最長的D題,我也是一直堅信能做出來,所以雖然做的時間很長,但是封榜後不久還是過了它。

    回想起大二在山科時的比賽,那次是打了鐵的,可能骨子裡會認為自己並沒有那麼差(不敢說自己優秀),所以那次打擊還是很大的,回來後我就常向那年山科的冠軍隊請教(那年的冠軍隊,一個是比賽之前我們就在qq上認識了,一個是我高中同學,現在都是我很好的哥們),自己還決定去刷書,刷的就是LRJ的入門經典,UVA上的題目質量是真心不錯,刷完大概一遍(除了前4章基礎篇和第12章的高階篇),真得有種脫胎換骨的感覺,這一點我可保證絕對是真的。然後還去CF上刷比賽,刷比賽為了保持競技狀態,然後把IOI國家集訓隊的論文拷在手機裡,演算法書看夠的時候就看論文,看懂就提高,看不懂就多看幾遍,硬啃。那一年基本上把時間都花到了ACM上,上課也是在看演算法書,作業啊都是抄一下,考試的話就是到時候再突擊。經過一年的訓練,大三下學期在山師的省賽我們只是拿了銀而已,其實當時有個dp是可以做的,但是當時是隊友負責dp,我就沒去想,賽後我補題很快就過了(和今年的K有點像。。)。所以我認為去年拿銀是我們隊伍出了問題(某一個人有問題就算是隊伍出了問題)。

    今年和我組隊的兩個學弟(一個大一,一個大二)很可愛,會思考,雖然他們兩個討論的效率不太高,但是我們隊還是很和諧的。自從去年省賽過後,就開始準備考研了,中間參加了一次CCPC的網路資格賽,和幾場網路賽,一場長春CCPC賽,和一場青島區域賽(拿到了銅牌,也是我們學校在區域賽上獎牌的零突破,拿到了第一塊區域賽銅牌),其他就沒有A題的時間了,都是在準備考研。仔細想想大家都拼命的複習考研,我還有心思參加ACM比賽,也算是比較奇葩了。

    總的來說我們今年拿到金牌,也算是實至名歸了,謝謝劉老師的指導和栽培,謝謝隊友,也謝謝實驗室的每個ACMer的努力,當然也要謝謝女朋友的體諒和陪伴啊^_^,也希望我們學校的學弟學妹們繼續加油,給你們開了個好頭,希望你們能再創輝煌,讓我們學校的ACM水平更上一層樓!