可持久化資料結構簡介
分類
部分可持久化
所有版本都可以訪問,但是隻有最新版本可以修改。
完全可持久化
所有版本都既可以訪問又可以修改。
實際應用
幾何計算(掃描線),字串處理(合併操作 rope
),版本回溯,函數語言程式設計。
可持久化線段樹
引入[P3834 【模板】可持久化線段樹 2]
首先考慮靜態全域性第 \(k\) 小,可以用權值線段樹,線上段樹上二分,同時也支援動態全域性第 \(k\) 小(單點修改)。
考慮靜態區間第 \(k\) 小,對於每個字首 \(a_{1,2,\dots,n}\) 都建一個權值線段樹 \(T_i\),\(T_i\) 中代表區間 \([l,r]\) 的節點存字首 \(a_{i,2,\dots,n}\) 中有多少個數在 \([l,r]\) 內。
對於 \([l,r]\) 的詢問,我們只需將 \(T_r\) 與 \(T_{l-1}\) 兩棵樹中的對應節點相減,就得到了該區間的權值線段樹。
但一共需要 \(O(n^2)\) 個節點,考慮最佳化。
發現 \(T_i\) 較 \(T_{i-1}\) 只修改了從 \(a_i\) 對應的葉子節點到根節點的路徑上的權值,共 \(O(\log n)\) 個節點。
因此,從 \(T_{i-1}\) 到 \(T_i\) 的過程中,我們只需要新建發生變化的 \(O(\log n)\) 個節點,剩下的節點與 \(T_{i-1}\) 共用(即新建根節點,被修改的兒子新建節點,未被修改的兒子仍用 \(T_{i-1}\) 的)。
區間修改同理,同樣只有 \(O(\log n)\) 個節點被修改。