我終於也要學可持久化了qwq
膜wjmzbmr**
———————————— 線 割 分 是 我 >ω< ——————————————————————–
資料結構的可持久化,就是把乙個資料結構的歷史狀態全都儲存下來,從而能夠快速查詢之前出現過的某個操作的結果。當然這必然會帶來很大的時間和空間消耗,因此優越的可持久化都會充分利用資料結構歷史狀態裡的相似部分來減少時間和空間複雜度。
顯然有乙個很裸的可持久化姿勢:對資料結構中的每乙個節點內嵌乙個資料結構(比如平衡樹或者stl裡那些東西),然後以時間為關鍵字維護歷史狀態(顯然會讓時間複雜度裡多乙個log).
只看可持久化線段樹和平衡樹就好了吧= =
我們來學一點姿勢(o゜▽゜)o☆
線段樹的可持久化
顯然我不能對他搞個平衡樹一段段區間往裡面扔…
首先查詢沒什麼好說的,還是跟普通線段樹的查詢姿勢一樣(就是查詢有了乙個不同的版本而已).重要的就是修改.
簡單的單點修改的話,只需要對每個節點修改前,先新建出乙個節點,讓這個節點記錄下當前節點的狀態,再對新建的節點修改就好了(๑•̀ㅂ•́)و✧對線段樹來說,修改乙個點要訪問的節點個數不過是lo
g(n)
個而已,所以每一次修改也只會新建出lo
g(n)
個新節點.
接下來就是區間修改+標記了.
標記下放時對兩個孩子節點分別建立新節點然後做單點修改的方式修改,而父節點並不需要(因為下放標記並不需要修改到他).
那標記要如何建立呢?
很簡單,當前節點如果被全部覆蓋,那就建乙個節點修改一下打上標記就好了;如果當前節點沒有被全部覆蓋,那就把他的子節點裡被全部覆蓋的那個新建節點修改打標記.
線段樹的可持久化實現起來好像很簡單**很短的樣子www
可持久化平衡樹
我並不想學treapqaq
會sbt,splay然而都不能加可持久化233
還是滾粗吧
可持久化資料結構維護可持久化陣列
首先我們要知道,undo 操作,也就是直接跳回前面的操作 歷史操作 然後跳回的地方到現在的地方這乙個區間的操作都不用管。這就是高階挑戰的思路 可持久化是指一種可以訪問歷史版本的資料結構 然後我們就可以知道,詢問歷史,又是陣列,也就是可持久化陣列。可持久化陣列的維護很簡單,我們可以開乙個 o n 2 ...
可持久化資料結構
1.可持久化線段樹 可持久化陣列 最基礎的可持久化資料結構,每次修改開新的log個點即可。includeusing namespace std const int n 1e6 100 templatevoid rd t x templatevoid print t x struct segseg n...
可持久化資料結構
用vector實現可持久化 這題要求的是乙個支援區間查詢的可持久化資料結構。這裡使用vector巧妙地實現 pair用pair儲存時間戳以及當前時間的值,query的時候使用二分查詢即可。如下 1 include2 include3 include4 include5 define x first ...