可持久線段樹

2022-08-02 11:06:07 字數 1247 閱讀 3744

思想和可持久化trie一模一樣,在歷史版本的基礎上構建新版本,即只增加發生改變的那條路徑。

**是用可持久化線段樹實現的主席樹,並通過了poj2104/hdu2665兩個求區間第k大題

1 #include2 #include3 #include

4 #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...