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

2022-03-05 02:08:10 字數 2626 閱讀 4984

可撤銷並查集模板:

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 sustainable_dsu 

int m = l+r >> 1;

build(lson[rt], l, m);

build(rson[rt], m+1, r);

}inline void init(int _n)

inline void update(int old, int &rt, int p, int v, int l, int r)

int m = l+r >> 1;

if(p <= m) update(lson[rt], lson[rt], p, v, l, m);

else update(rson[rt], rson[rt], p, v, m+1, r);

}inline void update(int rt, int p, int l, int r)

int m = l+r >> 1;

if(p <= m) update(lson[rt], p, l, m);

else update(rson[rt], p, m+1, r);

}///返回rt版本p位置fa陣列下標

inline int query(int rt, int p, int l, int r)

///返回rt版本p所在並查集fa陣列下標

inline int find(int rt, int p)

///在i時刻合併x和y所在並查集

inline void merge(int i, int x, int y)

}};

p3402 【模板】可持久化並查集

**:

#pragma gcc optimize(2)

#pragma gcc optimize(3)

#pragma gcc optimize(4)

#includeusing namespace std;

#define y1 y11

#define fi first

#define se second

#define pi acos(-1.0)

#define ll long long

//#define mp make_pair

#define pb push_back

#define ls rt<<1, l, m

#define rs rt<<1|1, m+1, r

#define ull unsigned ll

#define pll pair#define pli pair#define pii pair#define piii pair#define pdd pair#define mem(a, b) memset(a, b, sizeof(a))

#define debug(x) cerr << #x << " = " << x << "\n";

#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

//head

struct sustainable_dsu

int m = l+r >> 1;

build(lson[rt], l, m);

build(rson[rt], m+1, r);

}inline void init(int _n)

inline void update(int old, int &rt, int p, int v, int l, int r)

int m = l+r >> 1;

if(p <= m) update(lson[rt], lson[rt], p, v, l, m);

else update(rson[rt], rson[rt], p, v, m+1, r);

}inline void update(int rt, int p, int l, int r)

int m = l+r >> 1;

if(p <= m) update(lson[rt], p, l, m);

else update(rson[rt], p, m+1, r);

}///返回rt版本p位置fa陣列下標

inline int query(int rt, int p, int l, int r)

///返回rt版本p所在並查集fa陣列下標

inline int find(int rt, int p)

///在i時刻合併x和y所在並查集

inline void merge(int i, int x, int y)

}}s;int n, m, op, a, b;

int main()

}return 0;

}

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

主要學習的blog 1 將乙個點的父親 並查集那個fa 進行更改 實際上是新增乙個資訊點 update。2 查詢某個時間點下乙個pos對應的資訊點編號。3 查詢乙個點的父節點。4 更新乙個點的deep值,不用新寫函式,可以用3號操作找到編號後 5 初始化build。pragma gcc optimi...

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

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

可持久化並查集

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