CTSC2018 & APIO2018 頹廢 + 打鐵記


CTSC2018 & APIO2018 頹廢 + 打鐵記

CTSC

5 月 6 日

完美錯過報道,到酒店領了房卡放完行李后直接奔向八十中拿胸牌、飯票和資料。試機時是九省聯考的題,從來沒做過,我也不打算做了,隨便試了下鍵盤、打了個 \(A + B\) problem 就離開了機房;找到了學弟學妹帶他們回酒店頹……

晚上定外賣,領隊將密碼條送來,一日無事。

5 月 7 日

上午 8:30 開始的考試推到了 9:06,好像不同考場開始時間還不一樣?!

上來先看了看每道題,時限分別是 \(6\texttt{s}\)\(4\texttt{s}\)\(3\texttt{s}\),每道題都這么寬的時限?

T1 假面,看完題感覺信息比較多,整理了一下思路,發現它主要就是考對概率和期望的理解,因為我看到了血量上限是 \(100\) 這個條件,於是對於每個人維護一下每種血量的概率就完事了?想到這里沒有細想,感覺可以 A(flag),就接着往下看。

T2 暴力寫掛,怎么又是全國冬令營那種兩棵樹僅僅通過節點標號強行聯系在一起的題啊?感覺完全不會什么比較優的算法,不過 \(n^2\) 暴力好像能過 \(45\) 分?(我會 \(O(1)\) 求 lca 233333,而且時限是 \(4\texttt{s}\) 233333)

T3 青蕈領主,數數題啊,我還不是很擅長呢……先打暴力吧……誒等等算一下怎么只有 \(10\) 分?\(T = 100\) 的小數據是要干嘛?

於是我先寫了 T2 的 \(45\) 分暴力,很快跑過了所有樣例,測一下極限數據 \(n = 12345\) 的情況也能毫無懸念地在 \(4\texttt{s}\) 內跑出。

接下來去寫 T3 暴力,發現果然只有 \(10\) 分,當時並不知道怎么優化到 \(20\)。看看特殊性質,我發現我會 \(F(i, j) = j\) 的點,這個性質保證每個前綴的值域一定是一段連續區間,這樣 \(O(n^2)\) dp 一下就好了。寫完后跑一下發現怎么答案都是 \(2^{n-1}\)?我也沒想為啥直接改成了快速冪,怕這個 dp 又寫掛哪里導致丟分。

這個時候考試過去差不多一半,我開始寫 T1。在回答每個結界技能時,我處理了一下前后綴的 dp 信息,然后需要卷積合並,具體來說就是處理 \(Pre(i, j)\) 表示前 \(i\) 個人剩下 \(j\) 個存活的概率,\(Suf(i, j)\) 就是后 \(i\) 個;那么對於某個人 \(i\) 算他被打中的概率就是求所有情況中他被打中且打中其他人中 \(0\) 個、\(1\) 個、\(2\) 個等等的概率,就能計算出來了。這里明顯需要將 \(Pre(i-1, j)\)\(Suf(i+1, j)\)\(j \in [0, K]\),進行卷積,我開始寫了個暴力,然后發現復雜度是 \(O(C \cdot n^3)\) 的,運行了一下發現過不了,於是我將這個卷積改成 NTT,然后……更慢了……的確,這個 \(n = 200\) 的小卷積暴力就應該比 NTT 快。於是我改回暴力,在那里想了好久並沒有想出優化的辦法……

最后我檢查程序的路徑、文件名、文件讀寫的時候,突然發現 T3 暴力的優化方法——將 \(100\) 組詢問放在枚舉的內層跑,能剪掉很多情況。我在最后 \(10\) 分鍾改好了暴力,過掉了第 \(2\) 個樣例,然后平復心情,靜候考試結(掛)束(完)。

出來后發現全世界都 A 了 T1……有好多大佬會做 T3 的 \(60\) 分,然后打表打到了 \(80\) 分……感覺自己已經完全涼涼了。當時並不知道自己 T3 是 \(15\) 還是 \(25\),所以估計自己在 \(130 \sim 140\) 之間。

這天是 LazyJazz 的生日,本來想去看頭號玩家的,但是貌似電影院沒有今天的合適時間的場,所以鴿了,聽完講題后一起吃了頓呷哺呷哺,回酒店頹……

酒店里研究了好久 T2,由於太菜還是不會寫正解……(后來聽說 \(85\) 分數據很水,把邊權當成正的就可以直接樹形 dp 水過)

5 月 8 日

上午聽答辯,搶到了論文,感覺速度太快完全跟不上,也許以后補補?【評委還是一如既往地裝成一幅很專業的樣子

下午人工智能完全不聽,校園完全不(需要)參觀,待在酒店里頹(哎就當我在休息吧……調整狀態以備下一天的考試)。

晚上學習三國殺……突然發現好有意思 23333333333

5 月 9 日

這次上午 8:30 准時開始比賽了。

(由於一些問題,這個問題在后面會提到,二試的題面沒有公開,我簡述一下題意)

T1,給你一些果汁,每種果汁最多可以用 \(l_i\) 升,美味度為 \(d_i\),每用一升將消耗 \(p_i\) 元;現有 \(q\) 組詢問,每組詢問給出 \((g_i, L_i)\),表示詢問花至多 \(g_i\) 元至少喝 \(L_i\) 升能喝到的所有果汁的最小美味度的最大值是多少。

這個東西顯然就是一個二分 + 貪心,首先二分答案 \(x\),那么就只能使用 \(d_i \ge x\) 的果汁,然后將這些果汁按照價格從小到大排序貪心選取 \(L_i\) 升即可。

這題看完了一眼想到做法(愚蠢的是我開始以為這么做就完了,忘記它是多組詢問了……)

T2,給你一顆根節點為 \(0\) 的 trie,每個節點上有一個字符,表示 trie 上它到它父親邊上的字符,字符可以是數字、, 或者 ?,你需要將每個 ? 變成 , 或者數字,要求變之后

  • 串的字典序最小(串就是將 \(i\) 號節點上的字符放在第 \(i\) 位)
  • trie 上根到每個節點的路徑所代表的串是一個合法的嚴格遞增的正整數序列(就是由逗號隔開的一堆正整數)

細節太多我就不描述了……這題看看連暴力都難寫啊!等等,暴力好像拿不到分?\(11^8\) 貌似爆炸了,而且復雜度還不止這個?果斷棄療。

T3,提交答案題,有 \(K\) 台機器要計算 \(n\)\(A+B\) 問題,每個問題 \(u\) 有一個依賴問題 \(f\),需要這個依賴問題 \(f\) 解決后並將數據從 \(f\) 所在機器發送到 \(u\) 所在機器后 \(u\) 才能開始計算。給出第 \(i\) 個問題被第 \(j\) 台機器計算的時間 \(A_{i, j}\),以及第 \(i\) 台機器將數據傳輸到第 \(j\) 台機器的時間 \(R_{i, j}\)。並給出 \(op(op \in \{ 1, 2 \})\),若 \(op = 1\) 則最小化所有的計算時間總和加上傳輸時間總和,否則最小化最后一個問題計算完畢的時間。

看到題面里給了一個 simulator,不用自己手寫了,感覺很可玩;再看看數據,前兩個貌似可以暴力枚舉,后面有一些 \(m\)(依賴關系數目)為 \(0\) 的點;還有依賴關系是幾條鏈、分層圖的點,貌似比較有趣啊,寫完 T1 就來玩。

T1 我回去重新看了一下題面(因為我感覺不可能這么簡單),發現我果然看錯了……不慌不慌,這個題肯定是數據結構裸題,一定能想出來……先打暴力壓壓驚吧……暴力除了最后一個樣例都過了。

過了一會真的想出來了(我還想過整體二分、把所有果汁按照 \(d_i\) 降序排列並離線的做法,事實上這些思路對想到正解有一定幫助),我們對 \(d_i\) 從大到小建主席樹不就好了?二分答案后檢測答案是否可行時在值域線段樹上二分一下不就好了嗎?

好的開始寫正解,沒花多長時間,測一下發現暴力能過的樣例都過了,但是最后一個大樣例錯了一些地方,找了半天發現是一個乘法忘開 long long 了,改掉之后過了大樣例;然后寫了個對拍器和暴力對拍了幾百組數據,這道題應該沒問題了。

然后去玩 T3,我嘗試將它的 simulator 輸出到屏幕的東西輸出到文件,發現用終端中重定向的符號 > 沒有用,感覺很絕望;但是就在最關鍵的時刻我看到了一個叫 res.txt 的文件,里面包含一個整數,就是 simulator 運行出來的結果!希望重燃,我寫了個暴力跑了幾分鍾把第一個點過了,發現是 2 3 3 3 ...。照這個速度是不可能跑出第二個點的……怎么辦,為啥 simulator 這么慢?!

然后我寫了一個模擬退火,但是由於無敵慢,后面的點也最多兩三分的樣子,大多數還只是一分……

折騰這么久沒時間了……想不出送分點的特殊算法了,近乎絕望……(而且我不會寫 simulator,可能當時已經神志不清了吧……)

絕望地走出考場,聽說有人退火拿了 \(81\)?!醉了……

焦急等待成績……

焦急等待結果……

誒工作人員來了!刷開了機房門!他進去了……然后把門帶上了……

焦急等待成績……

焦急等待結果……

誒 CCF 領導來了!刷開了機房門!他們進去了……然后把門帶上了……

焦急等待成績……

焦急等待結果……

誒賈老師出來了!他出來了……然后告訴我們今天下午不做評測……woc 浪費感情。

接下來去看面試。候選隊英語不咋地,不過后面幾個英語水平明顯碾壓前面的。這次好像是史上第一次評委用英文提問?英文很多啊。

誒聽說有人程序丟了?!沒講評了?!沒有頒獎典禮了?!處處傳來“咕咕咕”的聲音。

這口鍋,有點大啊……

還沒完,我的程序也被搞丟了,在只有一個舞蹈節目的閉幕式草草結束后有 \(85\) 個人被點名留下……

CCF 的決定是明天重考一次,考什么題“無可奉告”,“大家不用擔心,我們不會虧待你們的”,“不用緊張,回去洗個澡早點睡,明天過來正常考試即可”。我也沒啥好說的了,場上已經有人提出異議,但出這問題本身就沒法解決……

晚上我教了一下兩個學弟這天的 T1 怎么做,我也去北師大實驗那邊求得了“退火真傳”,然后打一局三國殺,洗漱睡覺。

5 月 10 日

“今天要是考昨天原題我就……”(立了一個不好的 flag,最后裝作無事發生)

到了考場,下發紙質題后我真的驚了!我確認一下是否有陷阱,然而這題真的和昨天一模一樣!(當然 T2 題面進行了修改,T3 在題面末尾教你了如何給 simulator 添加運行權限)

機房里其他人早早開始敲起了代碼……

我直接寫 T1 正解,照着昨天的程序幾乎沒變地敲了下來……過了大樣例我就不管了。然后去搞 T3,首先用上前一天學會的 2> 重定向,然后寫退火,過掉了第一個點,然而發現 simulator 還是太慢,過不了第二個點,於是我下定決心自己寫一個 simulator,\(op = 2\) 的情況調了好久……

寫完 simulator,速度大幅提升,退火(要手動調參)得出了 \(1, 2, 6, 9, 10\) 的滿分答案,一些點的部分分答案,然后再把 \(3, 4\) 的特殊數據寫了,最后拼起來是 \(75\) 分。

我還是不明白怎么一個退火 \(81\) 分……

T2 我還是一看到就想吐,於是強上 \(11^8\) 暴力,聽說不會全 T,但是最后還是寫錯了。

比賽后兩個重考的學弟想先溜,我幫他們查了成績,他們都 A 了 T1,昨天告訴他們做法是有用的。我還是一如既往地涼。

然后就這樣我自己騎回了酒店,並完美錯過了 APIO 的報道……


CTSC 非常涼涼,我痛定思痛,大概總結了一下這次比賽打不過別人的原因:

  • 一試的 T1 \(30\) 分輸不起,這個題直接多項式除法一下就可以“逆”着 dp 回去了,完全沒有超過我的知識和思維難度范圍,這 \(30\) 分也導致了我最終沒有拿到 Au。
  • 從一試的 T2 可以看出我獲得部分分的能力非常低,大多數人能拿到的、NOIP 難度的分檔我都沒有拿到,當一棵樹是鏈的時候,可以樹形 dp,因為在鏈上無非就兩種情況:要么在 \(1\) 同側,那么深度較小的就是 lca,否則就是 \(1\) 的異側,那么節點 \(1\) 就是 lca。這道題還有人用隨機化亂搞過了,我認識的北師大實驗的初三用隨機化過掉了 \(90\) 分,他們亂搞能力太強了,相比之下我這方面能力就很差。
  • 同理二試的 T3 也反映出我亂搞能力、寫部分分的能力差這一點。

我認為解決辦法就是今后不僅要在模擬賽上多爭取拿分,在改題的時候也要多下點功夫,不是改成 \(100\) 分就結束了,而是接着實現一些復雜度更高的或是種類不同的算法、以及部分分所用到的算法。


APIO

這一天還在繼續,接下來好像就是休息、打三國殺、休息、定外賣……總之很頹。試了試 APIO 練習賽,感覺這個網站界面還挺友好。

5 月 11 日

今天復仇者聯盟 3 上映,這是一個大喜的日子,早在 CTSC 報道之前 LazyJazz 就鎖了 \(4\) 個座,在 7 號那天又多鎖了兩個座,上午聽了聽課,下午翹掉一波人全都去看復聯。無論特效還是劇情都無敵震撼,為了避免劇透被打,並且這是比賽總結並不是電影交流,我就略過了。

下午吃飯、領密碼條,一切照舊。

5 月 12 日

考試在 9:00 准時開始了。題目有各種語言的翻譯,感覺還是挺友好的。

點開題面:“五福”、“小明”……?這是什么風格?

點開 T1,一眼看上去是一道數據結構送分題,題意就是:給出 \(n\) 個位置在數軸上的超市,第 \(i\) 個超市會在時刻 \(a_i\) 到時刻 \(b_i\) 在坐標 \(x_i\) 出現,超市種類為 \(type_i\);隨后給出 \(q\) 組詢問,每次詢問在時刻 \(t_i\) 出現在位置 \(p_i\),求這個時刻所有種類的超市到 \(p_i\) 的距離最大是多少;種類 \(i\)\(p_i\) 的距離定義為所有種類為 \(i\) 的超市到 \(p_i\) 的距離的最小值。

首先想到離線,然后就是支持插入、刪除、詢問最大的“某個種類到某個位置的距離”,感覺隨便用個數據結構就能維護,於是往下看……

T2,是一道計算幾何?!給你 \(n\) 個平面上大小不同的圓,每次選擇一個半徑最大(若半徑相同則標號最小)的圓,刪掉它以及和它有交集的所有圓。求最終每個圓是由於誰刪掉的。

暴力?暴力?有時間再騙分!下一題。

T3,給出一個簡單無向圖,求選出三元組 \((s, c, t)(s \ne c, s \ne t, c \ne t)\) 的方案數,須滿足存在至少一條從 \(s\) 出發,在 \(t\) 結束,且經過 \(c\) 的簡單路徑,答案取模。

這什么東西?感覺跟雙連通分量很有關系?好像縮點之后 dp 一下?細節好多啊 QwQ,不過有好多部分分!

於是先回去重新看一眼 T1,打算完善一下剛才“隨便一個數據結構維護”的那個細節在腦中完善一下,發現懵逼了……

直接線段樹?可能要對於每個種類都維護一棵啊,查詢也需要在每棵上都查一下,復雜度爆炸!

怎么辦呢?是不是可以二分?!二分一個距離,然后這個位置往左往右擴這么多距離所形成的區間必須包含所有的種類,好像主席樹可以維護?等等主席樹的話,需要以位置為版本號,值域上維護的是上一個超市的位置啊;這樣不好維護修改啊(場后想了一下感覺似乎可以用樹狀數組套主席樹實現,但是感覺無敵難寫,當然這個二分是非常有價值的)……

陷入沉思……最重要的是要抓出所有種類的超市之和不超過 \(n\) 這個限制!除了超市不超過 \(n\) 個,還有什么不超過 \(n\) 個呢?誒,每種超市的相鄰位置之間夾的區間也是 \(O(n)\) 個的,並且一個二分區間不合法(就是沒有包含所有種類)一定會出現某個種類的區間包含了它這樣的情況,那么我們只需要判斷這些區間中是否有完全包含它的區間即可!至此轉化成了一個二維數點的問題,其實只需要詢問一個矩形區域內是否有點即可,所以對於每個區間左端點 \(l\) 上開一個堆維護最大的 \(r\) 即可。這樣好像恰好是兩個 \(\log n\) 的,\(5\texttt{s}\) 的實現肯定沒問題!

開寫!過了一些時間(我也不記得多長了,代碼不是很復雜),寫完了,小小地調了調過了樣例,交一發,WA \(0\)……

什么情況?寫個暴力!交一發,\(5\) 分……那就和暴力對對拍吧……

拍出了幾個錯,大概是在用 multiset 時出的技術問題,調完了交一發……T 了!\(47\) 分……(我忘了具體分值了,大概就是這個左右)

於是開始打 fread 讀入優化、輸出優化、*************(此處和諧若干卡常過程)

最后還是沒卡過,只有 \(57\) 分,有兩個 subtask 沒過。(本地也 T 了,大概是 \(6.7\texttt{s}\) 左右)

我發現沒過的有一個是 \(\forall i \in [1, n], a_i = 1\) 的子任務,這個東西可以倒過來變成只有加入操作,省掉一半的常數;我復制了一下代碼改了改,交了上去(利用了它可以自動拼部分分的功能),變成 \(80\) 分了。

我不甘心這道復雜度能 A 的題因為常數問題過不去,於是就對着代碼干瞪,顯然我的代碼在插入、刪除操作時,對線段樹里面套的堆的操作占去了大部分時間,於是我就主要瞪這里……

然后我就發現我 SB 了,這個東西在線段樹的葉子節點上套堆就行了,我在每個節點上都套了個堆……改了一下,修改復雜度降為一個 \(\log n\)(但是詢問復雜度還是兩個 \(\log n\)),成功通(卡)過了本題。

一看表發現 \(3\) 個小時過去了……涼啊……

T2 迅速打了一個 \(7\) 分暴力,跑去搞 T3……

T3 我上來就寫 tarjan 縮點,目標直接設定成 AC……我想一點部分分都不拿如果最后沒寫出來太虧了,而且樹的部分分可以幫忙檢查我想法的正確性(樹的子任務的程序是標解程序的一小部分),所以我先做了一下那個子任務,拿到 \(23\) 分,本來還想寫環的,但是考慮到有多個連通分量,我決定把時間留給正解……(這里決策太失誤了 QAQ)

在最后的時刻我的“正解”過掉了樣例,交了一發,肯定等不出結果了。就這樣比賽結束了,以涼涼(帶着一點小期待)收場。(當然最終這個期待被證實是完全多余的)

晚上照舊頹……

5 月 13 日

回了趟家,下午回去聽課,講的自動機……

【這好像是唯一一次在八十中吃晚飯?】

晚上頒獎典禮之前玩了一下琴,感覺這個琴有一點跑調,手感也很奇怪【其實就是給自己彈不好找借口】看到另外一位大佬彈神曲 orz

我們學校的舞蹈隊來表演辣 ~(≧▽≦)/~,贊!實在是太棒了!表演了兩場舞蹈,最后一場舞蹈撒花瓣撒的滿台都是……最后她們自覺清理掉了。

頒獎儀式顯得分外冗長,蒟蒻我在台下祈禱着不要在銅牌、銀牌名單里看到自己的名字……CTSC 成績差的有點遠(最后拿了一個 Ag),APIO 勉強卡線 Au……


這次 APIO 在最后一題上出現了決策的失誤,我太貪了,想在最后 \(40\) 分鍾打出正解,但顯然不可能。我當時應該清楚認識到自己不擅長這種問題並且看出部分分非常好拿並且分數很多,而且最后這點時間肯定反饋不了信息,無法驗證正確性,所以就應該好好寫部分分,況且它自動將每個子任務分數取 \(\max\),我沒能好好利用這一點真是可惜了。如果我最后一題求穩拿部分分的話就不會這么苟且地拿到 Au 了……



在寫這個總結時我還發現另外一個問題,我有兩次在考場上對一道題的第一反應出來的做法是錯誤的,后面回過頭來看時才發現,然后重新思考……

這可能是一個隱患問題,我可能會低估這題的難度而導致策略安排上的巨大偏差。

解決辦法就是:

  • 考試開始后先看完三道題,這樣可以對整體難度有一個把握,即使對某題的難度判斷失誤,在發現后仍可以靈活調整。
  • 第一次想錯難以避免,由此可見 “Think twice, code once” 的重要性,在沒有正確性和時間復雜度的完全把握時絕不敲代碼(當然亂搞除外)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM