題面見owenowl的部落格
以下是每道題:
第一天hdrf
注意到在刪除完乙個子樹前不會刪除其他的子樹。
於是可以遞迴處理這個問題,對於當前根節點,找到子樹中最小的節點,再以該節點為根遞迴。
每次遞迴完成後,整個子樹會被刪除,因此每個節點最多被遞迴到一次,即複雜度為n·k,k為每次找最小節點的複雜度。
找子樹中最小節點顯然就是維護dfs序,可以用線段樹維護。刪除就是把節點的值設為inf。
shortest path queries
10^5詢問區間且高度只有10,考慮用一維線段樹完成。考慮維護左右端點對應列的每一對點的最短路(相當於開100棵線段樹),l=r時顯然每條路徑都是0。考慮如何合併。
從左端點對應列到右端點對應列的一條路徑必然經過中間列。因此以所有中間列的點為起點跑dijkstra,在討論一下那條路最短就可以了。複雜度nlog2n。
子樹直徑
首先,兩棵樹合併時,直徑要麼過連邊要麼不過。不過連邊的時候直徑不變,過連邊就向兩側分別找最長鏈,端點一定是原來的直徑中的某個端點。那麼新的直徑一定是又原來的四個端點中的兩個組成的?
common ancestor
考慮兩棵子樹?
coprime queries
轉化為區間詢問倍數問題。查詢答案時確定區間左端點的位置?
動態揹包
顯然就是可持久化資料結構。
奇數讀書圖
偶數個點的聯通塊一定符合要求?
第二天matrix recurrence
化簡一下式子,發現就是要維護矩陣積,並且每個元素只會入隊出隊一次。
入隊很方便,直接乘。出隊難以實現。
對於這種問題,通常可以用ab站來解決。入隊時,將元素壓入b站。出隊時,如果a站沒有元素,就把b站o(n)倒序壓入a站,然後彈棧。如果有元素就直接彈棧。
把元素壓入a站時,維護乙個字首(棧底元素到當前元素)積。查詢答案就是b站所有元素的積乘上a站棧頂元素的字首積(不能每次重新計算整個a站,否則會**)。
fold
注意到模擬的時間複雜度會退化收斂,長度一直在減少。於是模擬就好了。
退化有時是難以發現的,但其實多推一推就可以。雅禮某一天的區間求mod也是這個原理,因為只有單點增加值和區間減少值,因此總的來說值肯定越來越小。
*****
兩個條件限制,顯然二分答案。維護每個點向左可以延伸多遠,向右可以延伸多遠,左右可以延伸多遠,用乙個主席樹維護。複雜度nlog2n不能過。
median on binary tree
維護一下dp值就可以了?
independent events
用泰勒展開化簡一下式子?發現就是維護每個點的某個表示式的值。推出來以後就簡單地用線段樹。主要化簡比較難。
welcome to icpcc amp 2017
考慮是如何操作的,以及每次究竟取了那些人,再思考一下怎麼統計方案數?最後用乙個樹狀陣列維護。
lowest common ancestor
發現每次詢問是在這個節點到根節點的鏈上的?
發現詢問即差分?
可能可以用樹鏈剖分維護,不是直接樹鏈剖分,其實是用重鏈的性質。
longest path
點分治加某某。
lykmul
先挖掘一下性質嘛。
然後就看什麼維護。
每道題還不是要具體分析, 又不會考資料結構板。深入理解資料結構就可以了,之後你做省選題只覺得都是智商題和閱讀題。
subsequence count
先列出轉移方程,發現可以用矩陣快速冪優化。
總結:整體二分我還不太會,二維樹狀陣列/線段樹還沒有寫過,基礎的資料結構應是掌握得較牢了。一些基礎的方法,如dfs序等,也漸漸強化了。
資料結構及概念分析總結
作為計算機專業的人,如果出去跟別人說自己不懂資料結構,那就是天大的笑話了,資料結構 演算法 程式設計,這是計算機屆公認的理論了,無論我們在做專案時,還是參加各種比賽,乃至於我們參加工作招聘,資料結構都是至關重要的,有時你甚至可以不懂計算機語言,但是不能不懂資料結構,通過上次的華為面試,我發現自己在資...
資料結構 總結
不知不覺間,跟隨賀老師的步伐已經乙個學期了。記得大一的時候,那個時候還沒有接觸到計算機專業的知識,那個時候便聽說了賀老師,那個時候對於老師厲害還沒有什麼概念,只是覺得可能是老師比較博學,比較深層次的了解一些計算機的內容,卻從未想過,這種厲害更加深入到了學生的腦海中,甚至可能會對乙個學生,一群學生,越...
資料結構總結
本文為總結了資料結構知識點,以便複習 本文為總結了資料結構知識點,以便複習 1.緒論 2.線性表 資料結構三要素 邏輯結構 儲存結構 物理結構 資料運算。其中邏輯結構包括線性結構 線性表 棧 佇列 和非線性結構 樹 圖 集合 儲存結構主要有 順序儲存 鏈式儲存 索引儲存 雜湊儲存 又稱hash儲存 ...