思想類似字首和,訪問某狀態的線段樹可通過末減初狀態進行求解。
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 #include6using
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...