隨便地點開了這道可持久化並查集,發現了真相...這和並查集有 pi 關係哦.除了find_father(而且還不能路徑壓縮),全都是線段樹0.0
題目沒什麼描述,就是三個操作:
1. 合併 a b
2. 回到第 k 步操作(三個操作均算操作)
3. 查詢 a b 在當前版本的並查集中是否在同一棵樹中
那麼..
.
對於操作 2 :簡單,我們直接把當前版本的根指向第 k 版本的根,一行就解決了(引起可持久化的罪魁禍首解決倒是簡單)
對於操作 3 :查詢fa和fb輸出就好了(貌似就操作 1 有點不好理解
)對於操作 1 ,模擬如圖:
**如下:
1上面**可能出鍋,下面**應該沒毛病...//by judge
2 #include3 #include4 #include5 #include6
#define ls ch[now][0]
7#define rs ch[now][1]
8#define mid (l+r>>1)
9#define swap(a,b) (a)^=(b)^=(a)^=(b)
10using
namespace
std;
11const
int m=2e5+11
; 12 inline int
read()
18int
n,m,cnt;
19int ed[m<<5],f[m<<5],ch[m<<5][2],dep[m<<5
];20 inline void build(int& now,int l,int
r)22 build(ls,l,mid), build(rs,mid+1
,r);23}
24void update(int& now,int las,int l,int r,int pos,int
fa)26
if(pos<=mid) update(ls,ch[las][0
],l,mid,pos,fa);
27else update(rs,ch[las][1],mid+1
,r,pos,fa);28}
29int query(int now,int l,int r,int
pos)
34void add(int now,int l,int r,int
pos)
36if(pos<=mid) add(ls,l,mid,pos);
37else add(rs,mid+1
,r,pos);38}
39int find(int ed,int
x)44
intmain()
62return0;
63 }
1by judge//by judge
2 #include3 #include4 #include5 #include6
#define ls ch[now][0]
7#define rs ch[now][1]
8#define mid (l+r>>1)
9#define swap(a,b) (a)^=(b)^=(a)^=(b)
10using
namespace
std;
11const
int m=2e5+11
; 12 inline int
read()
18int
n,m,cnt;
19int ed[m<<5],f[m<<5],ch[m<<5][2],dep[m<<5
];20 inline void build(int& now,int l,int
r)22 build(ls,l,mid), build(rs,mid+1
,r);23}
24void update(int& now,int las,int l,int r,int pos,int
fa)26 ls=ch[las][0], rs=ch[las][1
];27
if(pos<=mid) update(ls,ch[las][0
],l,mid,pos,fa);
28else update(rs,ch[las][1],mid+1
,r,pos,fa);29}
30int query(int now,int l,int r,int
pos)
35void add(int now,int l,int r,int
pos)
37if(pos<=mid) add(ls,l,mid,pos);
38else add(rs,mid+1
,r,pos);39}
40int find(int ed,int
x)45
intmain()
62return0;
63 }
可持久化並查集
n個集合 m個操作 1 a b 合併a,b所在集合 2 k 回到第k次操作之後的狀態 查詢算作操作 3 a b 詢問a,b是否屬於同一集合,是則輸出1否則輸出0 所給的a,b,k均經過加密,加密方法為x x xor lastans,lastans是上一次的輸出答案 並查集實質是乙個陣列,可持久化並查...
可持久化並查集
可持久化陣列 可持久化陣列是一種可以回退,訪問之前版本的陣列 是一些其他可持久化資料結構的基石 例如可持久化並查集 與普通並查集不同的是 這裡用到了 按秩合併新增鏈結描述 include const int n 2e5 7 int rootfa n rootdep n cnt,tot struct ...
可持久化並查集
點此看題 並查集最重要的就是fafa fa陣列,我們可以拿主席樹來維護這個fafa fa,並且每次改點只需要改乙個,為保證時間複雜度我們再維護乙個dep depde p來做啟發式合併,這就變成了乙個單點修改,單點查詢的主席樹了。include include using namespace std ...