主席樹模板

2021-10-02 07:12:08 字數 1836 閱讀 8565

今天學習了主席樹,我覺得我可以去黑入美國國防部的網路了。

所謂主席樹,它的真正含義和主席兩個字完全沒有聯絡。

主席樹的作用是儲存歷史版本的線段樹。

不知為何我對這張情有獨鍾。

劃圈的部分是單點修改後的新的線段樹。

下面**是一道主席樹模板題,求區間第k小的數的值。

此題思路就是每次插入乙個數,就新建一顆權值線段樹,變成主席樹。

輸入x到y求第k小的數,就是用第y個版本的線段樹減去第x-1個版本的線段樹,這樣所剩下的權值線段樹就是x到y這一區間上的數組成的權值線段樹了,然後查詢第k小。

就很妙。

//#pragma gcc optimize(3,"ofast","inline")

//#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int inf=

0x3f3f3f

;int mod=

1000000000

;const

int maxn=

2e5+7;

int n,m,cnt,root[maxn]

,a[maxn]

;//n是幾個點,m是幾次查詢,cnt就是個計數的,類似於是鄰接表裡的cnt。

//root陣列儲存每個版本線段樹的根節點編號,類似於鄰接表head陣列,a陣列儲存輸入的n個數。

struct node

t[maxn*40]

;//線段樹的結構體

vector<

int>v;

//此物是stl的容器,在這裡用於離散化。

intgetid

(int x)

//這個函式是找出以排好序的容器中x在哪個位置,update的時候用

void

update

(int l,

int r,

int&now,

int last,

int id)

intquery

(int l,

int r,

int x,

int y,

int k)

//查詢

intmain()

//輸入

sort

(v.begin()

,v.end()

);v.

erase

(unique

(v.begin()

,v.end()

),v.

end())

;//離散化

for(

int i=

1;i<=n;i++

)update(1

,n,root[i]

,root[i-1]

,getid

(a[i]))

;//插入

int l,r,q;

while

(m--

)//每次查詢

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