動態主席樹

2021-09-30 14:33:49 字數 1467 閱讀 4908

zoj 2112

#include

#include

#include

#include

#define ll long long

using namespace std;

const int maxn=10000

*15*16;

/*陣列註解:

root:代表主席樹的每個數字對應點的節點編號

a:原陣列的數

hash:離散化是二分的陣列

root2:樹狀陣列裡線段樹的根節點編號

rootl:每次查詢的多個樹狀陣列左區間節點編號

rootr:每次查詢的多個樹狀陣列右區間節點編號

*/int a[50010],hash[60010],root[50010],sz,n,m;

int root2[50010],rootl[50],rootr[50];

int cntl,cntr;//每次更新時左右區間樹狀陣列需要查詢的最多節點數

struct query//儲存操作

q[10010];

int get_hash(int

x)//hash值

struct chairman_of_tree

} tree[maxn];

int cont;

void init()

void update(int pre,int &k,int l,int r,int num,int val)//建立靜態主席樹

}int lowbit(int

x)

void arr_update(int &rt,int l,int r,int

pos,int val)//將第k個數改為val,更新樹狀陣列

tree[rt].sum+=val;

if(l==r) return ;

int mid=(l+r)>>1;

if(pos

<=mid) arr_update(tree[rt].l,l,mid,pos,val);

else arr_update(tree[rt].r,mid+1,r,pos,val);

}void arr_update(int k,int val)//將第k個數改為val預處理

}int query(int ql,int qr,int l,int r,int k)//查詢l~r的區間第k個數

else

}int kth(int l,int r,int k)//查詢l~r的區間第k個數預處理

} ac;

int main()

else

}sort(hash+1,hash+sz);//離散化

for(int i=1; i<=n; i++) //建立主席樹

ac.update(root[i-1],root[i],1,sz,get_hash(a[i]),1);

for(int i=0; i}

}

主席樹動態

以zoj2114為模板題。主席樹的動態單點改值主要是主席樹加樹狀陣列,具體暫未理解,待熟練仔細揣摩。如下 include include include include include using namespace std const int maxn 60000 struct nood q ma...

主席樹 動態 模板

自己整理模板,僅作模板儲存使用 include using namespace std const int maxn 6e4 5 主席樹最多需要在原空間上開大40倍,原空間本身首先要加大,這題原空間為50000 const int maxm 1e4 5 int t maxn s maxn l max...

主席樹 動態 Kth

1 zoj2112 2動態 kth 3每一棵線段樹是維護每乙個序列字首的值在任意區間的個數,4如果還是按照靜態的來做的話,那麼每一次修改都要遍歷o n 棵樹,5時間就是o 2 m nlogn tle 6考慮到字首和,我們通過樹狀陣列來優化,即樹狀陣列套主席樹,7每個節點都對應一棵主席樹,那麼修改操作...