主席樹模板 POJ2104

2021-08-21 07:31:43 字數 1281 閱讀 9614

離散化:

對陣列排完序後用unique去重,unique返回的是去重後的陣列的末位址,減去第乙個元素的位址就能得到去重後的陣列大小,用lower_bound查詢原數字在排序去重後的序列中的位序,用位序代替數字完成離散化。

#include

#include

using namespace std;

#define lson l,m,ls[rt]

#define rson m+1,r,rs[rt]

typedef

long

long ll;

const

int maxn =

1e5+5;

int ls[maxn*30]

,rs[maxn*30]

,tot,rts[maxn]

;//tot為總結點數

int t[maxn*30]

;int a[maxn]

,num[maxn]

;void

build

(int l,

int r,

int&rt)

void

add(

int p,

int c,

int l,

int r,

int&rt,

int lst)

intquery

(int x,

int y,

int l,

int r,

int k)

int n,m,c,x,y,k;

intmain()

sort

(num+

1,num+n+1)

;int cnt =

unique

(num+

1,num+n+1)

-(num+1)

;build(1

,cnt,rts[0]

);for(

int i=

1;i<=n;

++i)

a[i]

=lower_bound

(num+

1,num+cnt+

1,a[i]

)-num;

for(

int i=

1;i<=n;

++i)

add(a[i],1

,1,cnt,rts[i]

,rts[i-1]

);while

(m--)}

return0;

}

主席樹模板(poj2104)

主席樹是可持久化線段樹,可以記錄線段樹的歷史版本。中和線段樹不同的是,l,r記錄的是左右子樹編號,因為普通的線段樹版本中,左右子樹自然就是o 1和o 1 1,但是主席樹中並不保證這個特性,所以需要記錄一下。是 include include include include include using...

主席樹模板poj 2104

資料 主席樹主要是維護區間在第 個數插入之後,每個區間內的數出現的次數,這樣就需要維護 顆線段樹。可持久化在於它可以儲存前面任意第 個數插入時的區間情況 同時每顆樹結構都是一樣的,因此可以相減得到特定區間的情況 include include include include include incl...

主席樹入門 模板 POJ 2104

查詢區間第k大,而且沒有修改。主席樹的原理就是在現有的一顆線段樹上不斷加入新的節點,而加入的對於現有線段樹的影響另開一條鏈記錄下來,這樣我們就可以儲存線段樹的歷史版本,在查詢時只需要把區間減一下就可以了。include include include using namespace std cons...