2024.8.20隨筆

Nekopedia發表於2024-08-20

樹分治

這部分知識是我的弱項,之前學習時也沒有聽懂。此前碰到這類題也會想盡辦法用資料結構代替,但發現非常不可做,程式碼複雜程度極高。而且感覺之前我連普通的區間分治都不太熟練,沒有學好的信心。現在學習過後好了很多,理解了分治的核心(也許),就是每次到分治的關鍵點就去統計包含關鍵點的答案,然後去遞迴子區間,然後根據具體的題目要求選取合適的資料結構維護資訊。記得之前做過一道時間複雜度為 \(O(n\log n)\) 的題目,但是我當時不能熟練運用樹狀陣列所以嘗試用線段樹替代,然後被卡了很諤諤,後經高人指點終於懂得要選用常熟小、複雜度儘量低、程式碼寫起來較為簡單的資料結構,更關鍵的是要正確判斷題目需要維護的資訊的性質。

關於具體的樹分治,它分成點分和邊分。點分治就是每次在當前樹中選擇最優點(一般是重心)為根,然後 dfs 子樹維護資訊、更新答案。因為每次選擇最優點作為樹根,所以所有分治點暴力 dfs 的複雜度總共為 \(n\log n\) 的,加上維護資訊的複雜度(比普通維護多了一隻 \(\log\) 應該?)是比較優秀的。雖然一些複雜的資料結構時間複雜度可能比它低,但是在巨大的常數下也甘拜下風。

後面的邊分治與線上點分治(點分樹)都是屬於能夠理解但程式碼對我來說比較困難所以還沒有寫,明天自習也只是看情況,因為感覺點分治可代替他們,只是實現需要加一點科技。現在還是多寫幾道 dsu 和 點分治的題熟悉熟悉,確保考試碰到有大機率做出來才是正道!

做題

下午寫了幾道題感覺收穫較大,但是這兩天的程式碼還不是很熟悉吧。準備明天不寫太多題,就把板子多熟悉一下,保證在理解演算法的情況下能夠穩穩寫出來!

最後走之前一直在和 xjy 討論點分治與 dsu 的關係,感覺它們之間聯絡挺大的,很多題如果能用其中一個去寫,那麼極大機率也能用另一個去實現。就比如點分治的板子題,xjy 在用點分治寫出後沒有去趕做題進度,而是嘗試用 dsu 重新完成此題,並且他有一些疑惑也在詢問我,我在給他講解的同時也同時加深對這兩種演算法的印象、理解與思考,以及一些小小的技巧吧也許(?),還有最重要的注意事項。

最後在晚飯後他也靠自己成功 AC,想必他一定非常開心吧!在 AC 後他也積極與我交流一些有關東西,感覺挺不錯!他的精神值得我學習!我也不要再去有意無意去趕進度了,不要把做題看得太重!謹記!

最後

本來晚上說去九眼橋轉一圈的,未果。晚上沒有幹啥,就稍微看了一下這兩天得板子,在 B 站上看了一些科普類的影片,有收穫。今天運用量有點大,累了,睡覺去了。記錄一下寫文章時聽的音樂:feel the fire。豪庭!