主席樹詳解注釋

2021-08-21 14:41:20 字數 923 閱讀 5016

hdu 2665 (可作為模板使用)

題意 :給出乙個整數序列、有若干個問詢、每次問詢 (l, r, k) 表示 l~r 區間內第 k 大的值是多少

分析 :比較裸的主席樹題目

首先先對於每個字首按權值建出主席樹、然後問詢的時候就可以通過減法得到區間 (l, r) 的資訊

由於儲存的是值域資訊、查詢k大值的時候就判斷左右子區間的元素個數與k的大小便能知道往哪個方向走

**:

#include using namespace std;

#define memst(a,b) memset(a,b,sizeof(a))

#define fr(i,a,n) for(int i=a;i>1;

if(pos>mid) update(mid+1,r,t[x].r,t[y].r,pos);//因為pos>mid 所以在該節點的右邊

//

else update(l,mid,t[x].l,t[y].l,pos);//左邊

}/** query函式介紹

因為是查詢第k小,所以在查詢時候只需要看左邊孩子節點,

兩棵線段樹sum做差,便得到這個區間的值

比如 root[r]-root[l-1] ,則代表區間 [l,r] 的數的統計

所以 s=(r線段樹左孩子的sum)-(l-1線段樹左孩子的sum)

如果 s>=k(第k小),所以第k小肯定在左兒子節點,

否則,右節點,並且在右邊區間再找剩下的 k-s,即可。

*/int query(int l,int r,int x,int y,int k)

int main()

for(int i=0; i} return 0;

}

主席樹詳解

給定nn個數 intint範圍內 一共mm次詢問,每次都要詢問區間 l,r l,r 的第kk大的數。其中n,m,l,rn,m,l,r均不超過2 1052 105,保證詢問有答案。顯而易見,最暴力的辦法就是區間排序然後輸出排序後第kk個數。最壞情況的時間複雜度是o nmlgn o nmlgn 不超時才...

主席樹詳解

題目給你乙個序列,每次修改後算乙個新的版本,詢問某個版本中某個值 我們先以luogu p3919 模板 可持久化陣列 可持久化線段樹 平衡樹 作為模板講一下主席樹先學一下線段樹qaq 主席樹本名可持久化線段樹,也就是說,主席樹是基於線段樹發展而來的一種資料結構。其字首 可持久化 意在給線段樹增加一些...

區間第K值 主席樹詳解

序 這是一篇遲到的題解,機房的小夥伴們系統地學主席樹應該是七月份的時候,然而我沒趕上趟,當時壓根沒看懂主席樹是什麼東東。昨天晚上決定重新來過,於是請教了一位大神1113 這是他的部落格,不過好像因為手機驗證的原因很久沒有更新了 他告訴我了主席樹的始末,然後我就秒懂了,原來並沒有想象中的那麼複雜,相信...