可持久化並查集

2021-10-06 08:40:03 字數 1404 閱讀 7853

點此看題

並查集最重要的就是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 於是我們可以啟發式合併,將最大深度較小的集合合併到較大的那乙個.剩下的,暴力查詢暴力合併即可.由...