APIO 2020

這是一篇拖了兩個月的心得 (X),因為比賽時間正式結束前都要保密題目,而且後來又有 open contest,我就想說等 open contest 結束再寫心得,結果就拖到現在了,希望我沒有忘記太多。其實我本來想要把我的 code 放上來,但過太久比賽系統已經關了 QQ。

比賽那天是 8/15,這個暑假過得有夠忙,有 IONC、資訊營和暑培,而且資訊營隔天馬上就緊接著 APIO,一點喘息的時間都沒有,還好打得還不錯。

比賽前一週左右都是測機時間,但因為資訊營太忙,我到前一天才想起來,結果測機時間已經結束了,而且比賽系統不是 cms,所以我是在完全不知道系統長怎樣的情況去比,也不知道分數有沒有聯集,還好一切都跟我的想像差不多,分數有聯集,而且會把每一筆的結果顯示出來,不會只顯示到第一個錯的。

APIO 的時間是每個國家可以自己選五個小時打,臺灣就是 8/15 的下午一點到六點,所以快中午再到就好。中午午餐有一碗麵、一包薯條和一杯飲料,開始前就是一邊吃一邊耍廢。電腦是用二階時用的鍵位超怪筆電,作業系統有 Windows 和 Ubuntu 可以選,聽說建議用 Windows 打,因為 Ubuntu 沒測試過 (??),但沒有 CLion 的時候我習慣用 Ubuntu 打比賽而且 Ubuntu 有內建踩地雷,所以還是用 Ubuntu 了。因為比賽允許查資料,我就在開賽前先把 codebook 抓下來,就不用手打 default code 了。


子題和限制可以去 OJ.UZ 看。

pA 63/100

有一道牆分成 NN 格,從 00N1N-1 編號,還有 KK 種顏色,從 00K1K-1 編號,第 ii 格牆要被塗成顏色 C[i]C[i]。 有 MM 個工人,從 00M1M-1 編號,每個工人都有一些自己喜歡的顏色,且只願意塗自己喜歡的顏色。 每次操作可以選擇 xxyy0x<M0 \leq x < M0yNM0 \leq y \leq N-M,表示對於 0i<M0 \leq i < M,要叫工人 (x+i)modM(x+i) \bmod M 去塗第 y+iy+i 格牆。 第 ii 格牆只要被塗顏色,顏色在任何時刻都必須是 C[i]C[i],所以工人 (x+i)modM(x+i) \bmod M 喜歡的顏色必須要有 C[y+i]C[y+i]。 求最少幾個操作可以完成目標。

第一個子題是每種顏色只被最多一個工人喜歡,所以對於每個 yy 都可以知道要選哪個 xx,DP 一下就能線性。

剩下到第四個子題可以 O(NM)O(NM) DP,算每對 (x,y)(x,y) 可以塗多長,最後再 DP 一次。我寫的時候一直 WA,所以就拿小測資暴力對拍,發現是 DP 寫錯。小測資滿有用的,對於 debug 很有幫助。

pB 50/100

有一張無向簡單圖,NN 個點 MM 條邊,都從 00 開始編號,邊有權重。 有 QQ 筆詢問,每筆詢問表示有兩台車分別在節點 XXYY,這兩台車要分別要到節點 YYXX,它們不能在同一時間在同個節點上,也不能同時經過某條邊(不一定所有時間都要移動),求兩台車經過的所有邊中,邊權最大的,最小可以是多少,可能無解。 強制在線。

子題一是圖成數個鏈或環,我本來以為只要除了兩個點之間的路徑以外,有別的點就好,然後就一直 WA,想了一下發現是兩個節點所在的連通塊不是鏈就有解,所以就先把每個連通塊處理好,環的話答案就是環上權重最大的那條邊。

子題二是星狀圖,一樣就是直接判圖是不是鏈就好了。子題三是 O(QNM)O(QNM) 暴力,可以拿來對拍。

子題一很佛,給了超有用的提示,子題四要 O(QM)O(QM) 才能過,有了只有鏈不行的結論,就只要把邊由小到大依序加到圖上,一邊維護連通塊是不是環就好了,可以用 DSU 維護。

然後我寫心得的時候忽然想到滿分解 OAO,先做一次剛剛的加邊,兩個 set union 的時候弄一個 dummy vertex 當它們兩個的根節點(如果已經在同一個 set,就加一個點當新的根),在這個節點記錄現在連通塊是不是鏈、最大權重是多少,最後會蓋出一棵有 N+MN+M 個點的樹,詢問的時候,就找兩個點的共同祖先中,最低的連通塊不是鏈的,那個節點記錄的權重就是答案了。賽中怎麼沒想到 QQ。

pC 26/100

有一棵 NN 個節點的樹,點和邊編號都從 00 開始,每條邊的長度都是 11,兩點的距離記作 dis(u,v)dis(u,v),求一個點的 permutation P[0],P[1],...,P[N1]P[0],P[1],...,P[N-1],使得 0<i<N1, dis(P[i],P[i+1])dis(P[i1],P[i])\forall 0 < i < N - 1,\ dis(P[i], P[i + 1]) \leq dis(P[i - 1], P[i])。 沒有這麼簡單就結束,圖沒有給,但是可以詢問最多 400000400000 次,每次詢問可以問兩點之間的距離為何,或是詢問兩點 XXYY,有多少點 ZZ 滿足 XXZZ 的路徑經過 YY

前兩個子題都可以直接把整張圖問出來,然後先找樹直徑其中一端當第一個點,再不斷找和已經上一個放進答案的點距離最遠的點,放進答案裡。

子題三是 complete binary tree,而且編號是 heap index,寫到這的時候已經剩沒多少時間了,點的數量也沒辦法用剛剛的作法,所以我試圖亂猜出規律,結果丟上去 RE。


總分:139/300 排名:國際 88(銅牌),TWN 4

今年臺灣燒雞,拿了六銅,然後中國拿了 9 個金,強死。

第一次打五小時三題的比賽,其實氣氛滿輕鬆的,畢竟沒有悠關人生大事

pB 有個小插曲,就是我平常都會用 GDB 抓 RE,不過做這題的時候一直 SIGTRAP,backtrace 也找不到是哪裡有問題,這問題通常會發生在陣列出界,所以我就開始找是哪裡有問題,結果發現是只要我去讀 grader 傳來的變數就會這樣,搞了很久以後決定試著不要 GDB,然後就可以正常執行了?!?!之後我就沒有用 GDB,不過就很怕 RE 會不知道怎麼抓,還好後來都沒有本機 RE 了。但是這件事花了我半個小時,有夠糟糕。

這次最大的敗筆還是 GDB 的問題弄太久 QQ,不過後來我在做 pC 的時候又開回來,然後又可以正常跑了,感覺是 pB grader 的問題。

這是高一的最後一場比賽了,算是為高一的競賽生活畫下一個不錯的句點,這一年過得很充實,也進步了很多,從本來的青人到現在的橘人、從去年全國賽燒雞成 27 名到今年上了二階,我都不知道我是怎麼做到的。其實我滿慶幸有上二階的,不然我都沒在做學習歷程,想回頭準備學測應該不太可能,也沒辦法那麼自在的打競程了。

最後,官網說會有實體的參賽證明和獎牌,但我現在只收到電子版的參賽證明 QQ,希望不要 IOI 2022 才發 (?)。