題意:三種操作:(1)合併ab所在集合;(2)查詢ab是否在乙個集合;(3)狀態回到第x個操作之前。
思路:(1)每個節點儲存乙個深度;合併時找到兩個節點的根,ra,rb,若ra的深度小,則ra的父親設為rb,否則rb的父親設為ra;(2)查詢直接找到兩個的根。這個的複雜度是多少呢?貌似是logn*logn。每次查詢logn,深度logn;(3)這個就比較好操作了。
int ls[m],rs[m],dep[m],mp[m];
int e;
int root[n];
int n,m;
void build(int &t,int l,int r)
int m=(l+r)>>1;
build(ls[t],l,m);
build(rs[t],m+1,r);}
int get(int t,int l,int r,int x)
int get(int t,int x)
void upd(int l,int r,int x,int &y,int pos,int val)
ls[y]=ls[x];
rs[y]=rs[x];
int m=(l+r)>>1;
if(pos<=m) upd(l,m,ls[x],ls[y],pos,val);
else upd(m+1,r,rs[x],rs[y],pos,val);}
void add(int l,int r,int k,int pos)
int m=(l+r)>>1;
if(pos<=m) add(l,m,ls[k],pos);
else add(m+1,r,rs[k],pos);}
int main()
else if(op==2)
else
}}
BZOJ 3674 可持久化並查集
3674 可持久化並查集加強版 time limit 15 sec memory limit 256 mb submit 4051 solved 1503 submit status discuss description description 自從zkysb出了可持久化並查集後 hzwer 亂寫...
bzoj 3674 可持久化並查集)
傳送門 題解 一道可持久化並查集的裸題,板子子對了就能過 可持久化並查集是基於主席數的一種結構,可持久化並查集要求能夠訪問歷史版本,跟主席樹很像,所以可以通過主席樹維護普通並查集的fa陣列,但是由於用主席樹維護後沒有辦法用路徑壓縮,所以需要採用新的合併方式 啟發式合併,對每乙個節點增加乙個level...
bzoj 3674 可持久化並查集加強版
description 自從zkysb出了可持久化並查集後 hzwer 亂寫能ac,暴力踩標程 kuribohg 我不路徑壓縮就過了!ndsf 暴力就可以輕鬆虐!zky bzoj 3673的加強版。就沒了。include using namespace std const int n 200000 ...