可持久化資料結構

CheZiHe929發表於2024-07-26

可持久化資料結構簡介

分類

部分可持久化

所有版本都可以訪問,但是隻有最新版本可以修改。

完全可持久化

所有版本都既可以訪問又可以修改。

實際應用

幾何計算(掃描線),字串處理(合併操作 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)\) 個節點被修改。

相關文章