模板 主席樹

2021-09-26 09:33:29 字數 3701 閱讀 5916

主席樹

暫時小結

1.查詢區間有多少個不同的數//可以用樹狀陣列,線段樹,莫隊演算法

3.動態求區間的第k大//全部修改後查詢 //修改同時查詢

4.查詢某區間比指定的數大的個數//小的個數

5.數上路徑點權第k大

靜態區間第k大

#include

#include

#include

#include

using

namespace std;

const

int maxn =

200010

;int n, m;

int cnt;

struct node//存樹

tree[maxn *20]

;struct value//值 //離散化

value[maxn]

;bool

cmp(value v1, value v2)

//排序從到小

int root[maxn]

;//多顆線段樹的根節點

int yy[maxn]

;//原陣列離散之後的陣列

void

update

(int num,

int&rt,

int l,

int r)

intquery

(int i,

int j,

int k,

int l,

int r)

intmain()

//進行離散化

sort

(value +

1,value+n+

1, cmp)

;for

(int i=

1; i<=n; i++

)// init();//初始化

cnt=1;

for(

int i=

1; i<=n; i++

)int left, right,k;

for(

int i =

1; i <= m; i++

)return0;

}

陣列形式 靜態區間第k大

#include

#include

#include

#include

using

namespace std;

const

int mm=

200010

;int node,n,m;

int sum[mm*5]

,rt[mm]

,lc[mm*5]

,rc[mm*5]

;int a[mm]

,b[mm]

;int p;

void

build

(int

&t,int l,

int r)

//建樹

intupdate

(int o,

int l,

int r)

//更新

intquery

(int u,

int v,

int l,

int r,

int k)

//查詢

intmain()

sort

(b+1

,b+n+1)

;//離散化

int q=

unique

(b+1

,b+n+1)

-b-1;//

build

(rt[0]

,1,q);

for(

register

int i=

1; i<=n; i++

)int l,r,k,ans;

while

(m--

)return0;

}

//動態求第k大的值(zo2112)

q查詢c改變第i個的值為val

樹狀陣列套主席樹

#include

#include

#include

using

namespace std;

const

int maxn =

6e4+5;

const

int maxm =

1e4+5;

int t[maxn]

,s[maxn]

,l[maxn*32]

,r[maxn*32]

,sum[maxn*32]

;/*n是原序列個數

t[i]表示第i棵線段樹的根節點編號

s[i]表示樹狀陣列思維建的第i棵線段樹的根節點編號

l[i]表示節點i的左子節點編號

r[i]表示節點i的右子節點編號

sum[i]表示節點i對應區間中數的個數。*/

char str[60]

;int sz[maxn]

,h[maxn]

;int ul[maxn]

,ur[maxn]

;int tot,num,n,q;

struct node

q[maxm*4]

;//儲存詢問

void

build

(int

& rt,

int l,

int r)

//建樹

void

update

(int

& rt,

int pre,

int l,

int r,

int x,

int val)

//更新

intlowbit

(int x)

//樹狀陣列

void

add(

int x,

int val)

}int

sum(

int x,

bool flag)

return res;

}int

query

(int s,

int e,

int ts,

int te,

int l,

int r,

int k)

else

}//樹狀陣列 字首和

intmain()

else

}sort

(h+1

,h+1

+num)

;int tmp =

unique

(h+1

,h+1

+num)

-h-1

;//離散化

num = tmp;

tot=0;

build

(t[0],

1,num)

;for

(int i=

1; i<=n; i++

)for

(int i=

1; i<=n; i++

) s[i]

= t[0]

;for

(int i=

1; i<=q; i++

)else

//改變}}

return0;

}

主席樹 模板

思想 主席樹就是一顆持久化線段樹,為什麼叫持久化了,因為它可以儲存之前的線段樹版本,並且可以拿來用,從而優化空間.至於為什麼叫主席樹了,大概是因為發明這個演算法的人的名字的緣故吧 詳細說說 主席樹是一種離線資料結構,是由很多棵線段樹組成的。第i棵線段樹存的是前i個數的資訊 每乙個線段存數字的出現次數...

主席樹模板

維護n棵1 i的字首權值線段樹,每次查詢減一下就好了。poj 2104就是模板題,裸的靜態第k大,需要先離散化,不會的就用lower bound 多試試,研究研究應該就能懂。include include include include using namespace std const int m...

模板 主席樹

譴責奶人的hsz巨神 靜態版本 求區間第k大 可持久化也沒那麼高大上嘛,主席樹本質上就是多棵線段樹,求第k大就類似平衡樹的第k大。stay foolish,stay hungry,stay young,stay include include include include using namesp...