模板 可持久化權值線段樹(主席樹)

2022-09-06 17:30:11 字數 799 閱讀 5775

洛谷3834

主席樹入門題,靜態區間第k小

權值線段樹:一棵線段樹的葉子tree[l=r]節點記錄序列中滿足a[i]=l=r的數的個數,非葉子節點記錄兒子的sum之和;  這樣我們就可以快速地求出整個序列的第k小(或第k大)

為了能夠查詢區間的第k小,我們在序列1~n的每個位置i建立一棵權值線段樹,那麼對於區間[x,y],tree[y][l=r=k].sum-tree[x-1][l=r=k].sum即為這個區間中滿足a[i]=k的數的個數。

這用到了字首和的思想。通過這種方式我們可以快速查詢區間第k小。

1 #include2 #include3

#define ls(x) (a[x].l)

4#define rs(x) (a[x].r)

5#define mid ((l+r)>>1)

6using

namespace

std;

7const

int maxn=200010;8

intn,m,n,x,y,z,tot,b[maxn],c[maxn],root[maxn];

9struct treea[5000000

];10

void read(int &k)

16void add(int &u,int l,int r,int

pos)

20int query(int x,int y,int l,int r,int

k)25

intmain()

35return0;

36 }

view code

主席樹(可持久化權值線段樹)

主席樹模板題,求n個數中,第l個數到第r個數的第 小的數 includeusing namespace std define mid l r 1 struct node tree 210000 5 主席樹一般開32倍的空間 int a 210000 b 210000 t 210000 cnt int...

可持久化線段樹(主席樹)模板

題目背景 這是個非常經典的主席樹入門題 靜態區間第k小 資料已經過加強,請使用主席樹。同時請注意常數優化 題目描述 如題,給定n個正整數構成的序列,將對於指定的閉區間查詢其區間內的第k小值。輸入輸出格式 輸入格式 第一行包含兩個正整數n m,分別表示序列的長度和查詢的個數。第二行包含n個正整數,表示...

模板 可持久化線段樹 主席樹

這是一道非常直白的可持久化線段樹的練習題,目的並不是虐人,而是指導你入門可持久化資料結構。線段樹有個非常經典的應用是處理rmq問題,即區間最大 最小值詢問問題。現在我們把這個問題可持久化一下 q k l r 查詢數列在第k個版本時,區間 l,r 上的最大值 m k p v 把數列在第k個版本時的第p...