點此看題
並查集最重要的就是fafa
fa陣列,我們可以拿主席樹來維護這個fafa
fa,並且每次改點只需要改乙個,為保證時間複雜度我們再維護乙個dep
depde
p來做啟發式合併,這就變成了乙個單點修改,單點查詢的主席樹了。
#include
#include
using
namespace std;
const
int m =
200005
;const
int n =
30*m;
intread()
int n,m,cnt,rt[m]
,fa[n]
,dep[n]
,ls[n]
,rs[n]
;void
build
(int
&i,int l,
int r)
int mid=
(l+r)
>>1;
build
(ls[i]
,l,mid)
;build
(rs[i]
,mid+
1,r);}
void
upd(
int&x,
int y,
int l,
int r,
int p,
int v)
ls[x]
=ls[y]
;rs[x]
=rs[y]
;int mid=
(l+r)
>>1;
if(mid>=p)
upd(ls[x]
,ls[y]
,l,mid,p,v)
;else
upd(rs[x]
,rs[y]
,mid+
1,r,p,v);}
void
add(
int x,
int l,
int r,
int p)
int mid=
(l+r)
>>1;
if(mid>=p)
add(ls[x]
,l,mid,p)
;else
add(rs[x]
,mid+
1,r,p);}
intask
(int x,
int l,
int r,
int p)
intfind
(int e,
int x)
signed
main()
if(op==2)
if(op==3)
}}
可持久化並查集
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 ...
可持久化並查集
可持久化資料結構是在原資料結構的基礎上增加維護歷史版本的功能。但可持久化並查集的具體思路是利用主席樹維護不同版本的每個節點的父節點.如果並查集結構是鏈式,用按秩合併會導致單次查詢複雜度為 n log n 於是我們可以啟發式合併,將最大深度較小的集合合併到較大的那乙個.剩下的,暴力查詢暴力合併即可.由...