主席樹模板

2022-05-10 03:18:47 字數 938 閱讀 2317

首先考慮整個序列查第k大做法: 權值線段樹

將序列以權值為下標存入線段樹,每個節點存數字出現次數

栗子:序列 3 3 1 2 4 3 2 建成的權值線段樹

假如要找第3小的數

說先訪問根節點,發現根節點的左兒子正好有3個,進入左兒子

在左兒子中找地3大,他的左兒子只有乙個數所以訪問右兒子找第\(3-1\)大

此節點為根節點,直接返回值即可

而這道問題是求靜態區間第k小,用字首和思想對每個節點建立字首可持久化權值線段樹,然後每次查詢 l 到 \(r\) 的區間第k小時只要用 r 的值減去 l-1 的值即為 l−r 的權值線段樹,用上述方法直接查詢即可

#include#include#include#define m 200010

#define update(a) f[a]=f[ls[a]]+f[rs[a]]

using namespace std;

int cnt,i,m,n,j,k,a[m],b[m],pre[m],ls[m*20],rs[m*20],g[m],f[m],q,x,y,z;

void built1(int now,int l,int r)

void built(int now,int l,int r,int z,int p)

int mid=(l+r)>>1;

if(z<=mid)

else

update(now);

}int search(int x,int y,int z,int l,int r)

int main()

g[0]=cnt=1;

built1(1,1,m);

for(i=1;i<=n;++i)

for(i=1;i<=q;i++)

}

主席樹 模板

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