以p3919 【模板】可持久化陣列(可持久化線段樹/平衡樹)為例。
知識點:1.練習可持久化線段樹
2.線段樹維護數列。線段樹維護數列單點查詢僅需o(logn)
3.記得return root;
4.記得設定左右兒子
5.有時需注意cnt的初始大小
#include usingnamespace
std;
intn,m;
int rt[2000002
];int ls[2000002 * 20],rs[2000002 * 20
];int
cnt;
int tre[2000002 * 20
];int build(int l,int
r)
int mid = (l + r) / 2
; ls[root] =build(l,mid);
rs[root] = build(mid + 1
,r);
return
root;
}int query(int t,int l,int r,int
b)int updata(int t,int l,int r,int b,int
k)
//錯誤1:忘記為新建節點root設定左右兒子,
//漏了 ls[root] = ls[t]; rs[root] = rs[t];
//if(b <= mid)後面漏了ls[root] =
//else 後面漏了rs[root] =
ls[root] =ls[t];
rs[root] =rs[t];
int mid = (l + r) / 2
;
if(b <= mid)ls[root] =updata(ls[t],l,mid,b,k);
else rs[root] = updata(rs[t],mid + 1
,r,b,k);
return
root;
}int
main()
else
if(y == 1
)
}return0;
}
可持久化線段樹總結(可持久化線段樹,線段樹)
最近正在學習一種資料結構 可持久化線段樹。看了網上的許多部落格,弄了幾道模板題,思路有點亂了,所以還是來總結整理下吧。你需要維護這樣的乙個長度為 n 的陣列,支援如下幾種操作 在某個歷史版本上修改某乙個位置上的值 訪問某個歷史版本上的某一位置的值 此外,每進行一次操作 對於操作2,即為生成乙個完全一...
可持久化線段樹
可持久化線段樹,意思是可以查詢歷史記錄的線段樹。又叫主席樹。我們可以通過記錄不同的根節點,並在每乙個更新到的節點處新建必要的節點。詢問不同版本的主席樹,只需要進入不同的根節點即可。例題 給定n,m,輸入n個數組成的數列,有m個詢問,每次詢問l,r這個區間中,第k小的數的值。分析 這個題可以巧妙運用主...
可持久化線段樹
可持久化資料結構總是可以保留每乙個歷史版本,並且支援操作的不可變特性。對於這個說法,我表示非常贊同,因為可持久化的標誌就是在修改的過程中仍然可以保持原子樹的性質,對於直接全域性更改,倒不如把原來的一部分留下,用新的空間來記錄當前更改後的值,只改我們需要得到那一部分,因此我們開始研究可持久化的資料結構...