可持久化並 xian 查 duan 集 shu

2022-02-28 13:39:17 字數 2592 閱讀 3991

隨便地點開了這道可持久化並查集,發現了真相...這和並查集有 pi 關係哦.除了find_father(而且還不能路徑壓縮),全都是線段樹0.0

題目沒什麼描述,就是三個操作:

1. 合併 a b

2. 回到第 k 步操作(三個操作均算操作)

3. 查詢 a b 在當前版本的並查集中是否在同一棵樹中

那麼..

.

對於操作 2 :簡單,我們直接把當前版本的根指向第 k 版本的根,一行就解決了(引起可持久化的罪魁禍首解決倒是簡單)

對於操作 3 :查詢fafb輸出就好了(貌似就操作 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 }

上面**可能出鍋,下面**應該沒毛病...

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 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 }

by judge

可持久化並查集

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 ...