主席樹 入門

2022-06-03 05:21:10 字數 1505 閱讀 6079

思想類似字首和,訪問某狀態的線段樹可通過末減初狀態進行求解。

hdu4417 第二道模板題

有很多細節需要注意。

1.題目給定ai的高度可能為0,但通過離散化事實上不影響結論。

2.給定的訪問區間[x,y]以及高度h也可能為零,因而x,y需對應++。查詢依舊是root[y] - root[x-1]。

3.對於高度h,為了獲得其所對應的離散化後的高度,應該在b陣列(離散化前,排序去重後的陣列)中跑一遍upper_bound()。

4.upper_bound(b + 1, b + sz + 1, h)返回第乙個嚴格大於h的下標,此處返回的下標應該減一,從而符合題目「小於等於h的均能被hit」的規律。

5.此處比較巧妙的點在於,當返回的是原資料最小,也即返回下標1,則減一為0,因而可通過!k進行判斷是否有解。無解直接輸出0。

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;78

const

int maxn = 1e5 + 10;9

intn, q;

10int a[maxn], b[maxn];//

b用於記錄去重後離散化前的a

11int root[maxn];//

儲存每棵樹的根節點對應編號(cnt)

1213

int cnt = 0;//

標記可以使用的新節點

1415

struct

node

16tree[maxn << 5

];19

20void

init()

2127}28

29int upd(int pre, int pl, int pr, int

x)30

else42}

43return now;//

返回節點編號 44}

4546

int query(int u, int v, int pl, int pr, int

h)47

else55}

5657

intmain()

66 sort(b + 1, b + n + 1

);67

int sz = unique(b + 1, b + n + 1) - b - 1;//

不重複的元素個數

6869

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

75while(q--)

84init();85}

8687

return0;

88 }

主席樹入門

推薦部落格 早在很久之前就聽過主席樹這個名詞,不過一直沒有去學,當時想的是先把線段樹學明白了,今天想學這個是因為一場 cf。主席樹其實就是由 n 棵權值線段樹組成,並且你要保留著 i 棵線段樹的根節點,這 i 棵線段樹其實就可以看成是不同的歷史的版本,現在如果想讓我們查詢某一段區間時,我們直接做差就...

主席樹入門題

全稱是可持久化權值線段樹 以前一直分不清可持久化線段樹和主席樹的區別 但實際上寫法跟可持久化trie沒什麼區別,維護權值就ok了 那就不講了 description jz擁有乙個很大的野生動物園。這個動物園坐落在乙個狹長的山谷內,這個區域從南到北被劃分成n個區域,每個區域都飼養著一頭獅子。這些獅子從...

主席樹入門 部落格推薦

poj 2104 k th number,我也寫了關於這個題的部落格,有注釋,可以方便理解。include include include includeusing namespace std const int maxn 1e5 7 int root maxn a maxn x,y,k int n...