Atcoder賽後反思

lnw143發表於2024-04-21

先貼上本人主頁


目錄
  • ABC347 \(\tiny\color{blue}1624\color{red}-24\color{black}=\color{blue}1600\)
  • AGC066 \(\tiny\color{blue}1600\color{red}-21\color{black}=\color{cyan}1579\)
  • ABC348 \(\tiny\color{cyan}1579\color{green}+114\color{black}=\color{blue}1693\)
  • ABC349 \(\tiny\color{blue}1693\color{green}+67\color{black}=\color{blue}1760\)
  • ABC350 \(\tiny\color{blue}1760\color{red}-6\color{black}=\color{blue}1754\)


ABC347 \(\tiny\color{blue}1624\color{red}-24\color{black}=\color{blue}1600\)

藍名保衛戰,極限 1600

C 題還是有些思維難度的,最後才做出來,但是不夠簡潔

E 題忘開 %lld 喜提罰時

D 題最難評,又 WA 又 RE,最後如果輸出不符合條件就輸出 -1 才過

F 題原題,但是不會(

賽後發現就是一個二維字首和 + 二位字首max,還是挺簡單的

G 題不會

賽時打的太急了,罰時太多,速度也被拖慢了,同分的最高 performance 有 2000+,還是程式碼實現不夠快和準

AGC066 \(\tiny\color{blue}1600\color{red}-21\color{black}=\color{cyan}1579\)

E 題原題,還抓了一個抄題解的

A 題還是挺水的,只是沒想到從奇偶性的角度來想,題解給的是 \(O(N ^ 2 D)\) 的做法,但是有更優且更簡單的做法 \(O(N ^ 2)\),但是沒想到,還是考思維。

B 題有點愚人節,python 語言優勢很大(自帶高精度),用幾個 \(5 ^ x\) 拼起來多隨機幾次就完了,難繃(

藍名沒了 /ll

ABC348 \(\tiny\color{cyan}1579\color{green}+114\color{black}=\color{blue}1693\)

performance 2300+ 祭

0罰時切 A ~ F,讓我又想起了那場似的 rated

F 題聽說比較水,暴力 + O3 可過,但是我用 bitset \(O(\frac{N ^ 2 M}{\omega})\) 也過了(

G 題決策單調性最佳化板題,原題兩道:here & here (但我不會)

upd on 2024.4.14 : G 題改出來了,應用單調性還是比較簡單的,但是難在證明

ABC349 \(\tiny\color{blue}1693\color{green}+67\color{black}=\color{blue}1760\)

A ~ D 都比較順暢,D 題盲猜 \(\text{lowbit}\) 喜提機房一血,E 題沒開 long long 喜提一發罰時與機房一血

然後就坐著與 F & G 乾瞪眼,F 先是用 cdq 嘗試水分,後來將不是 \(M\) 因數的刪掉了,還是不行

最後發現 \(M\) 最多有 \(13\) 個因數,直接 \(O(2^{13}N) \approx 1.638 \times 10^9\) 過了,AtCoder 神機

但是打得太急,F 題 7 發罰時,最後 4 發最離譜,一發沒取模,一發取模太慢 TLE,一發將取模改成減法寫錯了,最後一發兩處取模是copy的都錯了,漏了一處沒改(

\(\small \color{green}525 \color{red}(7)\) !!

G 題直接並查集開水,快 T 了就 No,過了一半的資料點

實際上還可以開隨機化,因為對於 \(\forall i\),有些連邊是不需要的,有機率連到與目標解答案相同的狀態,但比賽後才想到(

ABC350 \(\tiny\color{blue}1760\color{red}-6\color{black}=\color{blue}1754\)

之前的總結寫的太籠統了,更像是提要。剛好今天實在是打 emo 了,犯了很多離譜的錯誤,想寫一篇個人直觀的反思,從 ratingperformance 中跳出來,慢慢地審視整個過程。

A 題其實沒有問題,可以直接A的,但是把 %03d 寫成了 %02d 樣例中也沒有 ABC001,於是就掛了。

後來幾道題一直很慌,越慌,越是想打快。越是快,就越出錯。這很嚴重拖慢了整個切題的速度。C 題本來是沒什麼問題的,但是急著想過掉它,核心的程式碼幾乎一半是錯的,第一發直接罰時,這時心情也是很差了,很焦躁。後來逼迫自己冷靜下來,又在草稿紙上畫了幾下,思路便逐漸清晰,於是便改對了。

到了賽點的後三題後,我其實剛剛鬆一口氣,看到 E 題又自閉了,畢竟機率題上次就栽過,是ABC342F,這次又看到,心裡一緊,只好先嚐試 F 題。

F 題讀完題後沒多久就想到了 dfs,然而實現中還是有一些小錯誤,如 for 迴圈裡更新 i 的話,它實際上還會 ++i/--i 一次,會跳過一個位置。好在沒罰時。

切完 F 題後看了一下 G 題,一開始讀錯題了以為那個線上是假的,高高興興拿樣例試水發現是錯的。沒辦法,於是看 E 題,結果旁邊的人看我藍名快沒了好心旁敲側擊,於是想到 DP,中途還有一個自己轉移到自己的,想到了之前的一道題目雖然我沒改出來,於是移項解方程即可。

一開始 \(10^{18}\) 我認為計搜是過不了的,因此打得不夠堅定,還有一個變數重名調了很久,實現不夠穩和準。開始是想著拿去水分的,但是直接過了,而且時間也很充裕(7ms)。賽後看題解,計搜時間複雜度實際上是 \(O(\log^3 n)\),但是主要問題是不會證明,對自己沒有信心,於是猶豫了很久。

到了最後的 G 題,此時還剩下 20 分鐘,已經機房內有人切了 G 題。出於對 G 題的潛意識壓力以及前面比賽的表現,我此時已經基本失去思考能力了,腦子一片嗡嗡的根本想不到正解,打了一個根本就沒機率的隨機化過了一半,最後遺憾收場。

機房內同年級的有 4 個人過了 G 題,其中 3 人都是水過的,還包括兩個程式碼相似的人。第四個大佬用了 splay

到這裡,你可能認為 G 題還是有點難度的。但是,實際上,這也是我在比賽中犯的最後一個,也是最大的一個錯誤。

讀完 G 題,其實不難想到如果維護好了森林中的每棵樹有確定的根(具體是哪個節點與答案無關),並且維護好了每個點在其所在連通塊中的朝向這個根的父親,那麼求解答案是 \(O(1)\) 的。比賽時這個念頭在我腦海裡一閃而過,但是很快就被否決了——原因很簡單,這個維護過程直觀上看是非常不可行的。後來,我轉而去想 bitset 時間換空間,但一無所獲。

然而,這就是問題所在——用暴力維護這些資訊實際上的時間複雜度是正確的!因為每次連邊的兩個點都是在不同的連通塊中,做完這次操作以後它們就會被合併,因此如果我們遍歷一遍較小的連通塊,總時間複雜度是 \(O(n\log n)\)!因此,這道 G 題出乎意料地短,甚至比我的隨機化程式碼還要少。


寫在最後:這次 ABC 可以看到除了少部分人,大多數人都沒有取得很理想,甚至可以說糟糕的成績。比賽結束後,我聽到有人在機房裡咒罵自己、題目和出題人的。還有人為了 rating 而悶悶不樂,諸如此類。但是有一點他們都錯了,我們打比賽不是為了 rating 去打,不是為了成績去打。以我為例,這次比賽我的 rating change-6,相對於之前 2200+performance,可謂是相當的差。但是,在這背後,是我被打亂的做題節奏,被擾亂的心態,使我過於激動的心情。這次比賽,暴露了我很多問題:程式碼實現不準不細心,讀題不仔細,對時間複雜度的不敏感,對時間複雜度證明的不熟練,而這些,都為我提供了寶貴的經驗,這遠遠不是幾點 rating 所能給我的。之前還看到旁邊的人比賽時一起討論題目,其實也是十分不應該——如果人人都只在乎 rating 以至於無人在乎演算法背後的玄妙,在乎它們的出處與歸宿,那麼 rating 早已失去它本來的意義了。希望各位在網路的各個角落的 Oier 都能保住自己的初心,守住心中的一寸淨土,為了 OIACM,乃至 CS 的明天而砥礪前行。

相關文章