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每個節點都對應一棵主席樹,那麼修改操作...