可持久化並查集 可撤銷並查集

2022-05-01 14:54:11 字數 2787 閱讀 9433

主要學習的blog/

1、將乙個點的父親(並查集那個fa)進行更改 (實際上是新增乙個資訊點)update。

2、查詢某個時間點下乙個pos對應的資訊點編號。

3、查詢乙個點的父節點。

4、更新乙個點的deep值,不用新寫函式,可以用3號操作找到編號後++。

5、初始化build。

//

#pragma gcc optimize(2)

//#pragma gcc optimize(3)

//#pragma gcc optimize(4)

#include #include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//#include

//using namespace __gnu_pbds;

using

namespace

std;

#define pb push_back

#define fi first

#define se second

#define debug(x) cerr<

#define bug cerr<

long

long

ll;typedef unsigned

long

long

ull;

typedef

long

double

ld;typedef pair

pii;

typedef pair

pll;

const

int inf = 0x3f3f3f3f

;const ll inff = 0x3f3f3f3f3f3f3f3f

;const

int mod = 998244353

;template

inline t read(t&x)

/**********showtime***********

*/int

n,m;

const

int maxn = 2e5+9

;

inttr[maxn];

struct

ttree[maxn * 30

];

int fa[maxn * 30], dp[maxn * 30

];

int tot = 0

;

void build(int & rt, int le, int

ri)

int mid = (le + ri) >> 1

; build(tree[rt].l, le, mid);

build(tree[rt].r, mid+1

, ri);

}void update(int last, int &rt, int le, int ri, int pos, int

ff)

int mid = (le + ri) >> 1

; tree[rt] =tree[last];

if(mid >=pos) update(tree[last].l, tree[rt].l, le, mid, pos, ff);

else update(tree[last].r, tree[rt].r, mid+1

, ri, pos, ff);

}int query(int rt, int le, int ri, int

pos)

int findfa(int rt, int

pos)

//void adddeep()

intmain()

if(dp[fu] >dp[fv]) swap(fu, fv);

update(tr[i-1], tr[i], 1

, n, fa[fu], fa[fv]);

if(dp[fu] ==dp[fv])

}else

if(op == 2

)

else

}return0;

}

view code

下面再附上乙個可撤銷並查集的模板

///

可撤回並查集模板

struct

ufs

inline

int find(int

x) inline

void merge(int x, int

y) );

fa[x] =y;

if(rnk[x] ==rnk[y]) );

rnk[y]++;}}

else

); fa[y] =x;}}

inline

void

undo()

}t;

view code

帶撤銷並查集 可持久化並查集

帶撤銷並查集支援從某個元素從原來的集合中撤出來,然後加入到乙個另外乙個集合中,或者刪除該元素 用乙個對映來表示元素和並查集中序號的關係,中用 to x 表示x號元素在並查集中的 id 刪除 x 號元素時,需要將 to x 的集合大小減去1,然後令 to x 1 標記 x 刪除即可 如果要重新加入乙個...

演算法筆記 可撤銷並查集 可持久化並查集

可撤銷並查集模板 struct ufs inline int find int x inline void merge int x,int y fa x y if rnk x rnk y rnk y else fa y x inline void undo ufs 可持久化並查集模板 struct ...

可持久化並查集

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是上一次的輸出答案 並查集實質是乙個陣列,可持久化並查...