主席樹 模板 KUR Couriers

2021-09-29 03:04:45 字數 1539 閱讀 6312

luogup3567

給乙個數列,每次詢問乙個區間內有沒有乙個數出現次數超過一半

每個數開新的線段樹,因為相鄰建的線段樹的相似性,新樹相同的連在舊樹上,不同再新開。——這便是主席樹主要思路

在兩顆樹中,做差就可得到l~r的線段樹,於是我們就可以支援區間的亂七八糟的操作

-------------------分界線------------------

比如本題,離散後維護權值線段樹,在l-1,r區間做差,在這顆(由做差構成的)l~r區間中值組成的線段樹上二分(其實就是走一遍線段樹,詳情參考二分查詢樹)

#include

using

namespace std;

inline

intread()

while

(isdigit

(s))

return ans;

}#define ls(x) lson[x]

#define rs(x) rson[x]

const

int n=

5e5+

10,nlogn=

20*n;

int n,g,a[n]

;struct nm

}b[n]

;int ys[n]

;void

init()

;int rt[n]

,cnt;

int t[nlogn]

;int lson[nlogn]

,rson[nlogn]

;void

updata

(int x)

void

build

(int x,

int l,

int r)

void

putin

(int x,

int y,

int l,

int r,

int goal)

int mid=

(l+r)

>>1;

if(goal<=mid)

putin(ls

(x)=

++cnt,

ls(y)

,l,mid,goal);if

(midputin(rs

(x)=

++cnt,

rs(y)

,mid+

1,r,goal)

;updata

(x);

}int

qur(

int x,

int y,

int l,

int r,

int gs)

intwork

(int x,

int y)

int q,x,y;

intmain()

}void

init()

sort

(b+1

,b+n+1)

;for

(int i=

1;i<=n;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...