1. 程式人生 > 其它 >THUSC 2022 遊記

THUSC 2022 遊記

1. 前言

很久沒有這種 OI/IOI(即有部分分)的比賽了,這次有機會參加 THUSC(類似 IOI 賽制,當場評測預測試資料,最終的資料與預測試資料僅有隨機數種子不同),很期待。

大概是個打醬油的,不過可以通過這次比賽感受一下自己與別人的差距。

2. 賽前

只是看了一些模板,比如樹剖、線段樹、主席樹、最短路(dijkstra)等。但是最短路並沒有自己寫一遍。

考前讓下載的 OBS 錄屏軟體挺好的,應該比 EV 錄屏強(至少專業一些,有各種錄屏選項)。

3. Day1 賽時

一共 \(4\) 道“正常”的題。

首先我把所有題看了一遍,發現 T3 最不可做,叫“通訊題”,因為之前沒有見過,就跳過了。T1

用到應該是圖論和期望(期望一直是我最牴觸的東西,一般有關期望的題都不會),但題意似乎很難理解;T2 題面冗長但簡化後的題意很好理解,大概是一個 dp 或者小清新資料結構;T4 是樹上的資料結構。

由於先看到 T4 了,我就先做 T4T4 有關樹上的鏈的操作,則大概需要用到樹剖。這時我還暗自慶幸複習過樹剖。想了一會,沒思路,就先去看部分分。我發現:暴力有 \(30\) 分,剩下的一部分用樹剖等做法也可以解決。到現在一共可以得到 \(50\) 分。我先打了 \(30\) 分的最基礎的暴力,還調了一會,剩下 \(20\) 分難寫,打算最後再寫。

然後去看 T1T1 的題目背景寫得很有文學色彩,不愧是清華的出題人。讀完一遍,發現有兩種可能。一種可能特別好做,另一種則很難做。我用好做的那種模擬了一下第一個樣例,竟然對了。 我沒有看樣例解釋,便開始寫,還確信是對的。

寫的過程中,用到了最短路 dijkstra 演算法,又慶幸複習了。打的過程中,發現:雖然思路簡單,但是不好寫。一下就寫了 \(150\) 行。寫完後去測試樣例,竟只有第一個樣例對了,剩下三個都錯了!我開始懷疑自己是否理解錯題了,便想到了那種難做的可能。看了一下第一個樣例的解釋,發現正好對應難做的可能!此時,我才意識到我讀錯題了,第一個樣例過去是僥倖!

此時我的心態有點崩,嘗試提交那份程式碼,卻趕上評測佇列很長(需要 \(30\) 分鐘)。我又看了一下程式碼,也許是寫掛了,那種理解能得很多分呢!我便發現,原來當時為了測試正確性,陣列開小了,而剩下三個樣例都是大樣例!我加上滾動陣列,再次測試了這四個樣例,發現竟然前三個樣例都過了!

我看了一下測試點的特殊性質,發現,我的錯誤理解正好在那幾個點中與正確的理解相同!也就是說我可以用錯解得到 \(40\) 分!我沒有檢查便趕快交了上去。

接下來去看 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,發現題面冗長,便跳過看 T3T3 的題面很簡潔,可是重頭戲在學習資料裡:學習資料中全都是一堆公式。我經過簡單的分析,發現,只要我們在輸入的東西中提取出公式裡需要的引數,並算出公式的值,便是答案。我將每一個引數的求法都一一列到了草稿紙上,理清思路後,便開始寫程式碼。寫完程式碼後,發現與答案的輸出不同。經過一些比對後,發現程式中的一個公式與學習資料的公式不同,改過來就對了。交上去果然全對了。

接下來看 T4T4 仍然需要參考學習資料。不過這次學習資料只有一個公式,我研究了一會理解了公式,便開始寫。寫出來程式碼,樣例的輸出卻很離譜。學習資料明明說這個東西是收斂的,但我的程式的輸出卻是發散的。我認為我應該是理解錯了公式。此時,我突然想到,有兩個學習資料,我可以結合另一個理解啊!我點開第二個學習資料,裡面模擬了一個情況,果然我的理解錯了。按照正確的公式改完後便過了樣例,提交後也是不出意外的對了。

過了 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 的緣故漲了一些信心。

不要對自己沒有信心,在意識到自己一些地方薄弱的情況下,也要發現自己的長處。