思想和可持久化trie一模一樣,在歷史版本的基礎上構建新版本,即只增加發生改變的那條路徑。
**是用可持久化線段樹實現的主席樹,並通過了poj2104/hdu2665兩個求區間第k大題
1 #include2 #include3 #include4 #include5 #include6 #include
7 #include8 #include9
#define maxn 1000005
10using
namespace
std;
11 typedef long
long
ll;12
13int tot=1
; //注意0節點作為虛擬空節點
14struct
node
19 node operator + (const node &t)const
2027 }node[2000015
];28
2930
int ins(int k,int num,int x,int l,int r) //
在k樹x位置+num並構建新樹
31 38
else
if(x<=mid)
3945
else
4652
53return
tmp;54}
55int query(int lroot,int rroot,int l,int r,int k) //
查詢第k大
5665
else
return query(node[lroot].rson,node[rroot].rson,mid+1,r,k-sum);66}
67int a[100005],sorted[100005],root[100005
];68
intmain()
69 83 sort( sorted + 1, sorted + 1 +n );
84int num = unique( sorted + 1, sorted + n + 1 ) - ( sorted + 1
);85
for ( int i = 1; i <= n; ++i )
8694
intl,r,k;
95while(m--)
96102
}103
104105
return0;
106 }
可持久化線段樹總結(可持久化線段樹,線段樹)
最近正在學習一種資料結構 可持久化線段樹。看了網上的許多部落格,弄了幾道模板題,思路有點亂了,所以還是來總結整理下吧。你需要維護這樣的乙個長度為 n 的陣列,支援如下幾種操作 在某個歷史版本上修改某乙個位置上的值 訪問某個歷史版本上的某一位置的值 此外,每進行一次操作 對於操作2,即為生成乙個完全一...
可持久化線段樹
可持久化線段樹,意思是可以查詢歷史記錄的線段樹。又叫主席樹。我們可以通過記錄不同的根節點,並在每乙個更新到的節點處新建必要的節點。詢問不同版本的主席樹,只需要進入不同的根節點即可。例題 給定n,m,輸入n個數組成的數列,有m個詢問,每次詢問l,r這個區間中,第k小的數的值。分析 這個題可以巧妙運用主...
可持久化線段樹
以p3919 模板 可持久化陣列 可持久化線段樹 平衡樹 為例。知識點 1.練習可持久化線段樹 2.線段樹維護數列。線段樹維護數列單點查詢僅需o logn 3.記得return root 4.記得設定左右兒子 5.有時需注意cnt的初始大小 include using namespace std i...