2017年省賽在樂山師範學院,時間是2017.6.3~2017.6.4,兩天。
第一天是報道日,提供午飯晚飯,下午15:30~18:00熱身賽。
第二天上午9:00正式開賽,14:00結束。15:30開始頒獎典禮。
第一天7點30起牀,把模板整理了一下,做成PDF拿到店裏去打印。
集訓隊9:15在校門口集合,去地鐵乘車。大一有兩個隊,和張老闆因爲要考高數,不能在上午和我們一起去。他們需要晚上21:30考完高數自己包車去。
天府廣場轉一號線,到火車南站,11:40的C字頭車。
車上背了一關單詞,然後睡意襲來……一覺醒來已經到樂山了。
打了個滴滴,到了「百步梯」。上去就是樂山師範學院了。
集訓隊10來個人,都在關心那個「百步梯」有幾階嗎……
熱身賽
省賽提供devcpp、vim、emacs、codeblocks、eclipse。
桌面上已經有vim了,我配置了一下vim,找到Devcpp的目錄,把Mingw64加入Path變量裏。
然後敲頭文件。
正在敲的時候,發題冊了。因爲是熱身賽,沒有那麼多規矩,包老闆就先開始讀題。
A題是個博弈。一個棋盤,一顆棋子。兩個人,輪流將棋子移動到相鄰(四連通)的格子裏。被走過一次的格子不能再走。給出棋盤長寬,每個人都採用最優的方案求最後誰會贏。
我當時也沒多想,這明顯就是一個博弈。腦補了一下,最優的情形應該是走遍整個棋盤然後無路可走啊!我給包老闆一說,他覺得不大對,他說再讀讀。
反正是熱身賽。我繼續悠閒地敲模板。敲完,編譯運行。
然而,我驚訝地發現,編譯出來的程序是「無法運行的64位程序」,而這個系統是Win7x86,2GB內存。
不管那麼多了,乾脆在Vim裏編輯,扔進Devcpp編譯。
後來我在codeblocks下面發現了Mingw32,理論上那個是能用的。
再看一看榜,很多人過了A題和B題。這太可怕了,難道真的是我想的這樣?
……然後我再仔細一看OJ上的A題,是一個A+B。題冊裏寫着的A題對應的是OJ上的B題。包老闆也覺得事情不對,趕緊讓我把剛剛那樣的思路敲上去交一發。
我們特別注意一下長寬的範圍似乎都是 109 ,就用long long存。乘起來判奇偶。
交了一發B題,AC。
然後我快速敲上A+B,AC。
這個時候,包老闆已經讀完題了。爲了方便接下來都用OJ上的題號指代題目。
C題是個神奇的題目,也是樓上往下扔雞蛋的問題,包老闆說他看不懂。
D題是個約瑟夫環的變種,線性的約瑟夫環。也就是說,n (
1≤n≤106
,好像是這樣)個人排成一排(不成環!),每次從第一個活着的開始殺,每數
k
個人殺掉。直到數到的編號已經超過
都不大會啊……我做一眼題的能力是很強的,但是做需要一點思考的題目的時候就gg了。
我去讀C題,也不是很懂題意,然後腦補了一個題意給包老闆。他敲出來之後,發現連第二個樣例都過不了。
然後我試圖用鏈表把D敲出來,但是失敗了,算法和碼力雙重意義上的失敗。這麼大的數據,應該是要用數學方法遞推,
過了好久,包老闆讀懂了C題的題意,然後開始往DP方向上思考,然後過了一會兒開始敲。
包老闆調了好久,交一發,AC。
這個時候已經差不多要到18:00了,很多隊已經收拾東西離開機房了。
我們還在繼續看D……嘗試做出來。
然後熱身賽就這麼結束了。
我把頭文件和vim配置還有Mingw32地址都保存在D盤。重啓一下,東西還在。當時心想應該沒有問題,看起來不會清。
最後一看榜,嚇死了,順哥他們隊AK了,第一。
出來一問,發現他兩個隊友都去樂山大佛玩了,似乎是單挑的……太強大了。
拿着餐券去吃晚飯了。我還有笑神隊吃了好多西瓜……
當晚,包老闆在房間裏刷高數,一直刷到凌晨1點張老闆到爲止……太強大了。
正式賽
和熱身賽一樣,正式賽也是在同一個機房舉行的。比賽場地附近全都是人。
我們悄悄地跑準備室附近看了一眼,發現滿地的氣球裏綠色的球最多。看來那就是簽到題(事實證明不是……那是防AK題的氣球)。
8:55左右,開始進機房。發題冊,一人一本。反覆強調不準偷看題冊,手機需要關機。
而電腦已經開機了,是電子教室軟件控制的黑屏的狀態。
9:00,比賽開始。電腦亮屏。
打開D盤的那一瞬間我簡直想打人。除了編輯器的安裝包什麼都沒有了!
那也沒有辦法。vim需要配置,費時間。那只能用devcpp寫了。
我趕緊敲上頭文件。張老闆和包老闆讀題。
我們讀題是隨機讀題的,據信這樣遇到簽到題的概率更大。
包老闆讀了A,發現是個簽到題。
敲完,樣例過了,交一發,WA。
我趕緊上去debug,發現,包老闆沒有測第四個樣例……而正是第4個樣例爆long long了……但是真的可怕,我建議包老闆統一轉換爲unsigned ll 處理。
看了榜,我發現了F題電科過了。題目是這樣的,判斷 F(x,y)=ax2+bxy+cy2 是不是在 x∈R,y∈R 上都有 F(x,y)≥0 , −10≤a,b,c≤10 。
我也不知道我怎麼想的,至少我現在還沒有辦法證明我的算法是對的。
算法是這樣的:暴力枚舉整數 x,y∈[−107,107] ,然后看 F(x,y) 是不是有小於0的值。
包老闆下來,我上去,1分鐘敲完,然後交一發,AC。全教室第一個氣球插在了我們前面。
這個題最後出來問了一下其他人怎麼做的,都是用二次函數的 Δ 寫了很久的樣子……
因爲題目安排上的問題,我們這個時候已經是十幾名左右了。
我們繼續讀題。包老闆去看L了。
我發現G題能做一下。給兩個連續的整數區間,讓你輸出分別從兩個區間裏取元素相乘,能產生幾個互異的2017的倍數。
我一下子反應過來,2017是個質數!
也就是說,把兩個區間包含「2017的倍數」的個數乘起來就行了!
一行敲完,然後發現樣例都過不了,我們的答案太大。
我拉上張老闆一起來debug。
原來問題在於,有一些數重複了,所以我們算出來的值大於樣例!
興奮,繼續修改。交一發,WA。
然後張老闆有了個想法,上去寫了一個,但是沒過樣例……
包老闆來了,他看了一下,說你這個個數算的有問題……區間算小了。只見他在我第二版的代碼上減了1……然後就過了樣例。
交一發,AC!
接下來2個小時,我們全都在做L。
我們一開始的思路是待定係數法腦補出公式然後計算。
然後一個小時過去了,毫無進展。
我突然想到,可以枚舉一個維度,利用公式+后綴和計算答案!
這樣只需要 O(n) 的複雜度!
張老闆和包老闆短暫地驗證了一下我的想法。包老闆敲了一段代碼,算出來的答案和我說的一樣。
我發現有個取模的問題,給包老闆說了讓他思考,然後我上去先敲框架。敲完了,樣例過了,交一發,WA Test 2。
……
然後我們檢查了一個小半小時無所謂的細節,WA了5、6次。最後30分鐘的時候,包老闆突然發現,取模遇上除法有問題。
我們給包老闆拿來書,他寫了一個擴展歐幾里得算了一個乘法逆元。
我寫了一個連續自然數的對拍,生成了一堆數字。沒拍出錯誤來。於是交一發,WA Test 2。
包老闆建議交了一下暴力的,TLE Test 2。太可怕了……
然後我改了一下,做了一個隨機數的對拍,出現錯誤了。
包老闆興奮地上去debug,我們輸出了很多中間變量。發現,是我的那一段有問題。計算的過程中,有一個中間變量是負數。經過取模之後就錯了……
發現這個的時候只剩5分鐘了。我們重寫了一下核心代碼,但是因爲括號匹配炸了,連編譯都過不了。
突然,包老闆明白過來,出現負數的時候需要加上mod再%mod!
手忙腳亂地刪掉debug代碼,然後過了我的對拍!交一發。
但是,網頁返回“out of time”。
我們的2017四川省賽結束了。
看了一下,封榜前大概30多名。
這樣的名次肯定是連牌都沒有了。
頒獎典禮
出了門,遇到笑神。笑神給我們說,金14個(10%),銀28個(20%),銅42個(30%)。前42名都是有銀牌的……松了一口氣,最菜也是有銅啊。
最後,銅獎發完,沒有我們隊的名字出現。
拿到了一個銀牌。後來在終榜上是30多名。
反思
自從練習賽的時候多次爆int,我特別注意了int溢出的問題。
所以基本上不會犯這樣的錯誤了。
但是這次……對負數取mod……我是在51nod上見過這樣的題的。但是沒有及時想到……
還有很多問題……未完成