CSP2024 遊記 / 總結
賽前
賽前打的最後一場模擬賽寄掉了。感覺狀態不是很好。但根據 RP 守恆定律,CSP 大抵不會很差。
前一天晚上就到鄭州了,在酒店住了一晚,屬於是適應一下環境了。爽睡。
賽時
T1
2:30~2:45 簽到題,從小到大排序之後貪心地讓第 \(i\) 個怪獸和前面所有活著的怪獸戰鬥,開個桶就行。很快速地碼了。
T2
2:45~3:45 每輛車超速的路段是一段連續的區間,可以計算出來,然後問題就變成了:有若干條線段和若干單點,從中選出儘量少的單點,使得覆蓋的線段儘量多。這不是程式碼源原題弱化版嗎。把區間按左端點從大到小排序之後,雙指標搞一下,如果上一次選出的單點能覆蓋當前遍歷到的這條線段就不動,否則貪心地選擇在這條線段左端點右邊的最靠左的單點,判斷它是否能覆蓋這條線段,如果能,更新答案,並將這個單點標記為使用。
3:45~5:00 寫完之後發現最後一組樣例沒過,開始調。手玩了很久都沒想到 hack,這貪心太對了呀,於是有點紅溫了。又開始想是不是線段處理有問題,改了幾個版本都不對,更紅溫了。去上了個廁所,回來之後選擇先放過去,去看 T3 和 T4。
T3
5:00~5:15 把 T3 和 T4 都看了,感覺 T3 的暴力 dp 不是很好寫,就寫了一個暴搜去看 T4 了。
T4
5:15~6:20 性質 A 是純模擬送分,但是沒想到這題這麼難寫,寫了一個多點才把性質 A 寫過,還只有 16 分。感覺模擬能力有待提升。
賽後
感覺寄了。T2 假飛,T3 多項式複雜度的 dp 沒寫,T4 還只拿了 16 分。
回來路上一直在想 T2 假哪裡了,一直沒想通,和同學對思路發現一樣的,只不過同學是按右端點從小到大排序。應該是一樣的吧。於是嘗試還原了一下程式碼,並把排序方式改了一下,測大樣例,果然還是假了。但是這次第二個小樣例就假了。打了一下表,發現是因為:有的線段我就算使用最靠左的那個單點也無法覆蓋到,但我仍然移動到了這個單點,產生了不必要的代價,我後面的線段可能可以繼續沿用先前的那個單點。在 if
里加了一個判斷語句就過了。賽時程式碼洛谷上有 40 分,希望 CCF 資料也水一點吧。
然後又靜下心來去看 T3,發現 \(n^3\) 的 dp 很好想,即 \(f(i,j,k)\) 表示前 \(i\) 個裡面左邊最後一個是 \(j\),右邊最後一個是 \(k\),賽時不知道為啥腦抽了沒想到。\(n^2\) 是很套路的狀態最佳化,因為 \(j\) 和 \(k\) 裡面一定有一個是 \(i\),所以可以省掉一維,用 \(f(i,j)\) 表示第另一邊最後一個是 \(j\) 的狀態,具體左右不重要。然後把這個樸素 dp 寫出來之後會發現,轉移有兩種:一種是字首加,另一種是字首取 \(\max\),再加上結尾相同數的貢獻。我們考慮用 \(now\) 統計當前做的所有字首加的總和,\(sum_i\) 表示對 \(0\sim i-1\) 的字首加總和,這樣就可以 \(O(1)\) 轉移了。至於對結尾相同數的貢獻,由於值域只有 \(10^6\),對每種數記錄最大值就行了。連想帶碼只用了一個點出頭。
感覺這把又寄 T2 上了。又上頭了。哎,咋又寄了呢。T3 賽後看真是一眼題,賽時咋就沒想到呢。
有一種越集訓越唐了的感覺。
哎,又要說那句話了嗎。
“不要氣餒,打上 ‘我一定能 AK NOIP’ 的思想鋼印。”
再多打點模擬賽吧。