THUSC 2022 遊記
1. 前言
很久沒有這種 OI/IOI(即有部分分)的比賽了,這次有機會參加 THUSC(類似 IOI 賽制,當場評測預測試資料,最終的資料與預測試資料僅有隨機數種子不同),很期待。
大概是個打醬油的,不過可以通過這次比賽感受一下自己與別人的差距。
2. 賽前
只是看了一些模板,比如樹剖、線段樹、主席樹、最短路(dijkstra
)等。但是最短路並沒有自己寫一遍。
考前讓下載的 OBS 錄屏軟體挺好的,應該比 EV 錄屏強(至少專業一些,有各種錄屏選項)。
3. Day1 賽時
一共 \(4\) 道“正常”的題。
首先我把所有題看了一遍,發現 T3 最不可做,叫“通訊題”,因為之前沒有見過,就跳過了。T1
由於先看到 T4 了,我就先做 T4。T4 有關樹上的鏈的操作,則大概需要用到樹剖。這時我還暗自慶幸複習過樹剖。想了一會,沒思路,就先去看部分分。我發現:暴力有 \(30\) 分,剩下的一部分用樹剖等做法也可以解決。到現在一共可以得到 \(50\) 分。我先打了 \(30\) 分的最基礎的暴力,還調了一會,剩下 \(20\) 分難寫,打算最後再寫。
然後去看 T1。T1 的題目背景寫得很有文學色彩,不愧是清華的出題人。讀完一遍,發現有兩種可能。一種可能特別好做,另一種則很難做。我用好做的那種模擬了一下第一個樣例,竟然對了。 我沒有看樣例解釋,便開始寫,還確信是對的。
寫的過程中,用到了最短路 dijkstra
演算法,又慶幸複習了。打的過程中,發現:雖然思路簡單,但是不好寫。一下就寫了 \(150\) 行。寫完後去測試樣例,竟只有第一個樣例對了,剩下三個都錯了!我開始懷疑自己是否理解錯題了,便想到了那種難做的可能。看了一下第一個樣例的解釋,發現正好對應難做的可能!此時,我才意識到我讀錯題了,第一個樣例過去是僥倖!
此時我的心態有點崩,嘗試提交那份程式碼,卻趕上評測佇列很長(需要 \(30\) 分鐘)。我又看了一下程式碼,也許是寫掛了,那種理解能得很多分呢!我便發現,原來當時為了測試正確性,陣列開小了,而剩下三個樣例都是大樣例!我加上滾動陣列,再次測試了這四個樣例,發現竟然前三個樣例都過了!
接下來去看 T2,發現暴力的 \(20\) 分很顯然,而如果簡單優化一下可以得到另外 \(30\) 分(也就是說我一眼秒了 \(50\) 分)。先寫了一個,結果發現不太好寫(碼力太差),調了半天,不過最終還是寫完了。
不知道中間什麼時候,告訴 T4 的一個部分分更新了,而更新後那個部分分就是送分的,我趕緊寫了一下便交了。
此時,評測佇列已經特別長了,大概有一小時,所以我現在 T1,T2,T4 最新的程式碼都不知道分數,此時心裡很忐忑不安。在 T1,T2,T4 之間反覆橫跳了一會,檢查了一下,發現都沒什麼可改的。
時間過得很快,不知不覺就離比賽結束還有 \(30\text{min}\) 了,此時想去打 T4 的那兩個部分分。猶豫了一會,開始寫,發現其中一個特別難寫,而另一個不能用系統自帶的 set 而必須自己寫平衡樹,也很難寫,我遂放棄了,怕寫掛了影響前面的分。
又待了一會,結束了。
4. Day1 賽後
\(19:20\) 結束的,結束後評測結果才出來,我發現:T1 預料的 \(40\) 分竟掛成了 \(15\) 分(只過了第一個點),不知道為什麼; T2 竟然沒有掛掉,就是 \(50\) 分;T4 那個送分的部分分竟時間超限了,仔細看,發現自己居然傻到暴力跳 lca
(和暴力的時間複雜度一樣)求 x->y
路徑的邊的個數,而不是用深度相減 \(\mathcal O(1)\) 求出來!這樣的複雜度就退化成暴力了!(是不是當時太忐忑不安了,不知不覺寫掛的)
我快速地吃了個飯,發現晚上有 ABC,準備打。打的時候狀態十分不好,C 題都寫了很久。到了 E 題,發現這道題可以用一個結論轉化成最短路(dijkstra
解決)。我開始寫,結果寫掛了,最終調出來,發現自己的優先佇列(priority_queue
)寫成普通佇列(queue
)了!改後便過了。此時我突然意識到,考場上寫的 T1 的最短路是不是也只用了 queue
?!我趕快查了錄影,還真是!原來掛分的原因之一是這個問題啊!也許除了這個問題,還會掛分,甚至部分分思路是假的,但這種問題犯了就沒戲了啊!
此時,Day1 的估分變成了 \(15+50+30=95\)。
去問了一起參加的兩個初二學長,分數都比我高多了,看來我 Day1 掛分掛得有點慘(雖然實力也與他們有巨大差距)。
5. Day2 賽時
之前聽說 Day2 都是工程題,也就是“碼農題”,大模擬一類的。題目的特點是:會下發一些網上的學習資料,而我們寫的程式也要參考學習資料(考察選手的學習能力)。這對我來說是一個挑戰也是一個鍛鍊的機會。在今年省選上,Day1 T1 大模擬寫掛變成 \(70\) 分,是個遺憾。賽後給 hjl VP,結果他 1h 就一遍過了。這也更加讓我對我的碼力不自信了。不過這題的 \(5\) 道題總分只有 \(100\) 分,與 Day1(每道題 \(100\) 分)有巨大區別。
首先看到 T1,發現要編寫一個解析 html 網頁程式碼的程式。簡單分析後,發現這是一道送分題,便寫了。寫完提交上去,發現提交很順暢,但在第 \(3\) 個點錯了。我沒有趕緊調,而是去做其他題了,因為不值得對和 \(4\) 分花大量時間。
此時,我對這些題的估計仍舊是:剩下題都是很難的題,只要能做出來一點便是好事。
看到 T2,發現題面冗長,便跳過看 T3。T3 的題面很簡潔,可是重頭戲在學習資料裡:學習資料中全都是一堆公式。我經過簡單的分析,發現,只要我們在輸入的東西中提取出公式裡需要的引數,並算出公式的值,便是答案。我將每一個引數的求法都一一列到了草稿紙上,理清思路後,便開始寫程式碼。寫完程式碼後,發現與答案的輸出不同。經過一些比對後,發現程式中的一個公式與學習資料的公式不同,改過來就對了。交上去果然全對了。
接下來看 T4。T4 仍然需要參考學習資料。不過這次學習資料只有一個公式,我研究了一會理解了公式,便開始寫。寫出來程式碼,樣例的輸出卻很離譜。學習資料明明說這個東西是收斂的,但我的程式的輸出卻是發散的。我認為我應該是理解錯了公式。此時,我突然想到,有兩個學習資料,我可以結合另一個理解啊!我點開第二個學習資料,裡面模擬了一個情況,果然我的理解錯了。按照正確的公式改完後便過了樣例,提交後也是不出意外的對了。
過了 T4 後看 T5,發現題面完全不能理解。學習資料有三個,寫得也不能理解。我便回去看 T2。我發現,T2 題面已經說明了要幹什麼,不需要學習資料,而做法便是直接同時進行多個 dfs
。使用棧維護即可。寫完後,竟然沒有除錯,直接過了樣例,提交後過了。
此時,我再回去看 T1 為何在第三個測試點錯了。我注意到了三種需要忽略的情況:script,style,img
。如果在 script
裡放進一個 style
,則我的程式便會出錯。我發現,我的程式完全不能特判這種情況!冷靜下來,我回顧了一下題面,發現我剛剛說的那種情況壓根不存在。這又使我放下了心。大概是資料造錯了吧!我便不打算繼續調下去了。
剩下的一點時間,去看 T5 但還是讀不懂。從那時到比賽結束,一直沒有新的進展了。
6. Day2 賽後
賽後聽講題,得知 Day2 T1 的第三個預測試資料就是錯的,最終的資料不會出現那種情況。所以我大概能對 Day2 的前四題。
7. 總結
這次比賽我相對來說 Day1 發揮不好而 Day2 發揮挺好。
Day1 的主要問題是把大部分時間浪費在 T1 上,而 T1 讀錯題了。最短路寫掛也是不應該的。
其次的問題是 T4 的那個送分的部分分居然忘了複雜度這回事,直接暴力跳的。
需要改進的地方概括起來:
-
認真讀題,認真讀樣例,完全搞懂樣例。
-
考前複習好模板,最好打一遍,不要出現會的模板打掛這種白送的事。
-
思路要清晰,不能出現打一個程式碼與暴力對拍,拍出來一個錯,打一個補丁,接著又能拍出來,又打一個補丁,直到放棄。(指 Day1 T2,不過好在最後調出來了)
-
需要在概率與期望上深入學習。
不過其實在 Day2 發揮的還是挺好的,弱項的大模擬居然能寫出來 4 題。
感覺這次因為 Day2 的緣故漲了一些信心。
不要對自己沒有信心,在意識到自己一些地方薄弱的情況下,也要發現自己的長處。