2024從國慶到CSP前總結

Nekopedia發表於2024-10-24

前言

這是一篇遲來的總結,不過可能也不算太遲。

正文

截至起稿時間(2024.10.23),這個月已經講了四次課,考了五場試。內容基本全是基於前一段時間的內容進行提升,對我而言很有幫助。我也意識到自己的很多問題,包括考試也包括做題,後面我會進行詳細地分析。

關於講課

內容涉及到了 ds、dp、圖論、數學、字串,所遴選的題目均為提高水平及以上,題目顏色從藍到黑,以紫為主。

ds 方面主要是選的合併資料結構的題,對於這些題我們還是要回歸題目本身,先去想題目的性質,然後考慮維護什麼資訊,如果不好維護我們怎麼轉換,然後選取什麼樣的資料結構?空間、時間、程式碼實現難度都是我們需要考慮的。給的題寫了 \(\frac{3}{4}\),但是最難寫也是最有含金量的題基本沒碰。必須在 noip 前把這種硬骨頭啃下來!

dp 的題太過於巧妙,我見到了許多技巧,感覺這些非常高妙。但是我認為還是要老老實實先去想樸素 dp,然後最佳化就交給上天吧!但是一些固定技巧還是需要掌握,像決策單調性、斜率最佳化啥的的題都必須要會寫。還有就是需要特別注意一些不好想 dp 狀態的題目,這個時候就放手一搏吧(霧不要害怕直接上高維 dp / 超級狀壓 dp,然後慢慢分析題目性質去剪枝。截止起稿時間題單完成度(8/20),感覺寫不動,程式碼沒思路。問了一些學長,建議可以看題解是如何實現的,但是真正寫程式碼時必須獨立完成

圖論感覺講得比較雜(本來也就該這樣),主要要注意的是建模,這方面還需要多做題。其次就是 tarjan 的一堆東西需要熟練,我還做的不太到位,需要抽時間多複習幾次!然後是進階的圓方樹,還有虛樹(瞭解大概怎麼建優秀就行)需要花一點時間搞。

數學講了拉插,現在完全搞懂了,線性基在之前講線性代數的時候自己悟出來了。但是數學的內容都很重要,現在我還是對一些數學知識有遺忘,記憶不深刻。而我在數學方面下的功夫還不是特別多,之後重點要搞數學,得把一些東西學透。

貪心的東西挺有趣也挺考人的,需要一定時間的思考,但是還好。不想做程式碼難度太大的題時可以做幾道放鬆一下。

總之講課的內容有很多需要加深、強化,後面需要更加努力了。

考試

10.14 考的圖論的基礎練習,反映出我很多問題。對待事物非常馬虎,這很致命!必須改掉這個壞毛病!表現出的“症狀”就是第一題建模時沒把條件寫全然後寄了。審題驗證對於題目的想法能力欠缺,考試時第二題沒想通透。T4 就差一步也說明了我圖論建模能力不足。我要多注意偏序關係以及相等關係!這些二元關係都可以看成點與點之間的長度限制。

10.15 的題有點難崩,第一道是 wqs 二分+最小生成樹,之前水哥還講過,我沒太想起來。T2 經典二分圖建模寫了,T3 alpha beta 剪枝,但是我連暴力 dfs 都寫假了,還花了不少時間,真正考試還需要注意時間的分配,T4 是有向圖割點,自己賽時按自己的想法寫了一個發現假了,結果需要掌握支配樹的知識,但是我認為現階段還不需要掌握所以沒去改題。

10.19 開始就是比較綜合的 noip 及以上的模擬賽了。第一題簽到不管;第二題是一個性質較為明顯的題,但是我沒想出 dp 就去貪心了,結果假了,以後遇到這種情況考慮轉換 dp 記錄的狀態,然後再去嘗試,而不是幹啥都往貪心方面去想,要給 dp 留空間,也要適當考慮貪心。T3 一眼線段樹維護一段狀態,但是時間不夠我就沒寫,下來感覺維護不難就鴿了。T4 就是要從最簡單情況入手找性質,然後發現一些簡單的二維偏序關係,於是就可以類似 cdq 分治 一樣去建圖,感覺題很好,然後就去寫了題解。

10.21 考得不好,T1 掛了,純推式子有一個地方計算錯誤,T2 非常傻逼一道題居然沒有想出來(最大子段和套上列舉最大最小),我都已經寫完最大子段和但就是不知道怎麼找最大,這時其實直接欽定就行,反正如果不優就一定會被更新掉。T3 我都沒太把題讀對,然後套線段樹加奇妙最佳化亂搞,正確性有點假但是資料水把我放過了,後面把題目讀清楚才發現求最小不是相差最小(雖然程式碼寫的是最小),於是按最小的插入然後按順序(或倒序)掃一遍就行,那樹狀陣列存一下就做完了。T4 神秘題不知道沒講也就暫時沒管了。

10.22 T1 \(O(n)\) 時間 \(O(1)\) 空間薄紗所有解法!薄紗標算!T2 以為是 SA 然後寫了一個板子就去亂搞,最後沒發現什麼有用的性質就資料分治了一下 70pts,結果正解就是最佳化 35pts 的暴力,其中 \(O(n)\) 判斷是否可以更新答案的地方可以用 hash 預處理加上 \(\log n\) 的二分判斷。後面兩道很神秘沒管。

10.23 成為耐掛王了,300pts->70pts。很難過,又想起去年了,很晚才睡著。題很簡單,目測綠藍藍黑,前三道真隨便做,結果第一題沒特判上界有一個地方,第二題 kmp 求反函式炸了,賽後改成 exkmp 就過了,T3 也是一個性質題,結果下面運動會排練吵得我一直沒想出程式碼實現就難崩,就兩個樹狀陣列再記一記字首的東西就行,明明都寫了就是組合計數的有一點地方一直沒有推出來導致 0 pts,最後真就差一點。T4 都沒有時間去想了,主要因為中午睡覺起來頭昏導致 T2 調久了且還把最壞情況 kmp 複雜度算錯。

總結

關於做題

對於一個題目,先去通讀題面,瞭解你需要求什麼東西,觀察要求的東西有什麼特點,比如如果只是求一個最值你就可以考慮二分啥的,或者優先考慮 dp 貪心這兩個。然後就需要根據具體題目去分析性質,根據性質做題。

具體做題的時候比如你發現了性質先別慌,想想它可能跟什麼有關,然後把能找到的性質儘量都找找,像什麼答案是取一段一段前/字尾的,或者是取滿足一些條件的一定不劣之類的可以對狀態進行剪枝。把這些性質找完後羅列出來,看看怎麼將它們有機結合,具體的還是得看題。然後做題的時候不強制去想正解,你先去想怎麼做能滿足正確性。滿足正確性後就需要去關注資料範圍和\(\color\red資料邊界\)

因為我實力還不夠,有的題可能就不能直接想出正解,這時我可以先得到一個不優秀的解法,然後考慮去用資料結構最佳化一些找狀態的過程,如果有很多狀態重複就應該考慮預處理一些東西把它們記下來。如果發現這些還不行那就需要考慮最佳化記錄的狀態了,想想能不能找到一些條件去等價代替當前條件,或者用更鬆弛的條件去代替然後容斥一下。

想好過程之後應該把它寫在紙上重新驗證一下,這時需要想對於你需要用到的演算法有什麼特殊的資料存在讓其時間複雜度最劣。然後嘗試手玩一下。最後確定無誤就趕快敲程式碼。

關於考試

考試不是單純的做題,而是做題與騙分、時間規劃、心態等多重因素共同作用的結合體。對於現階段的我來說,T1 肯定能切,如果是 csps 那 T2 也能穩切,這時就需要慢慢來但還要注意時間。

在我心中這些因素的排序是這樣的:\(\text{心態}\ge\text{時間規劃}\ge\text{做題}\ge\text{騙分}\)。我的心態還不太好,需要多磨練,有時會因為比預期提前做出 T1 而興奮,也會因為思路被卡、程式碼調不出而慌張,這是不行的。真正考試時需要放平心態,不要被旁人壓力,\(\color\red相信\)自己還是很強的!然後對於時間規劃,我要把 T1 的完成時間控制在 50min 以前,但是就算超出也不要慌 ,就說明題可能較難,正常做就行。T2 正常做完要控制在 2h 內,因為這樣才有時間去想後面兩道題的部分分。如果看 T3 眉清目秀可以先去把 T4 暴力打完再衝 T3 正解,否則就去找找性質,看如果能湊出 \(\ge50pts\) 就直接把部分分寫完去看 T4,實在想不出來也沒關係,大不了就拿 20 到 30 分。想想萬一 T4 能湊出更多的分呢?