閒來無事想學k短路,但看著很難打(
順手學的可持久化左偏樹倒是容易,來寫一發
基本思路就是每次merge的時候將普通左偏樹里準備作為新的根的結點copy乙個,對新結點搞事
然後所有操作基於merge
然後就沒了(
最近比較懶不想寫泛型和oop,oier碼風將就一下(
什麼時候寫好了泛型單獨放**
struct node};
node *root[
1<<10]
;int vertot;
node *
merge
(node *l,node *r)
ptr-
>npl=ptr-
>rc!=
null
?ptr-
>rc-
>npl+1:
1;return ptr;
}node *
push
(int val,node *rt)
inttop
(node *rt)
node *
pop(node *rt)
可持久化陣列(可持久化線段樹 平衡樹)
update 最後乙個點時間空間已經放大 標題即題意 有了可持久化陣列,便可以實現很多衍生的可持久化功能 例如 可持久化並查集 如題,你需要維護這樣的乙個長度為 n n n 的陣列,支援如下幾種操作 在某個歷史版本上修改某乙個位置上的值 訪問某個歷史版本上的某一位置的值 此外,每進行一次操作 對於操...
可持久化線段樹(主席樹)及可持久化陣列
定義 可以訪問歷史版本的線段樹為可持久化線段樹 可持久化線段樹之所以可以訪問歷史版本,是因為巨集觀上看,它為每個版本維護了一棵樹。當然,如果真的對每個版本建一顆樹,時間空間複雜度都hold不住。所以建立i版本的樹時,如果某顆子樹相對於i 1版本沒有變化,就可以直接使其父親對應的指標指向i 1版本的這...
模板 可持久化陣列(可持久化線段樹 平衡樹)
update 最後乙個點時間空間已經放大 標題即題意 有了可持久化陣列,便可以實現很多衍生的可持久化功能 例如 可持久化並查集 如題,你需要維護這樣的乙個長度為 n n n 的陣列,支援如下幾種操作 在某個歷史版本上修改某乙個位置上的值 訪問某個歷史版本上的某一位置的值 此外,每進行一次操作 對於操...