bzoj 3674 可持久化並查集加強版

2021-08-07 16:44:29 字數 1721 閱讀 2642

description:

自從zkysb出了可持久化並查集後……

hzwer:亂寫能ac,暴力踩標程

kuribohg:我不路徑壓縮就過了!

ndsf:暴力就可以輕鬆虐!

zky:……

bzoj 3673的加強版。。。就沒了。。。

#include 

using namespace std;

const int n = 200000 + 10, m = 5000000 + 10, inf = 0x3f3f3f3f;

int root[n], lson[m], rson[m], par[m], rnk[m];

int tot;

int n;

void build(int l, int r, int &x)

int mid = (l + r) >> 1;

build(l, mid, lson[x]);

build(mid + 1, r, rson[x]);

}int query(int l, int r, int p, int

x)void update(int l, int r, int

pos, int val, int pre, int &x)

int mid = (l + r) >> 1;

if(pos

<= mid) update(l, mid, pos, val, lson[pre], lson[x]);

else update(mid + 1, r, pos, val, rson[pre], rson[x]);

}void add_rnk(int l, int r, int

pos, int

x) int mid = (l + r) >> 1;

if(pos

<= mid) add_rnk(l, mid, pos, lson[x]);

else add_rnk(mid + 1, r, pos, rson[x]);

}int ufs_find(int p, int

x) return r;

}//int ufs_find(int p, int

x)//

//int ufs_find(int p, int

x)//還是別路徑壓縮的好。。。

//int main()

else

if(op == 2)

else

}return

0;}

//貼個rope版的,實現超級簡單

#include

#include

using

namespace

std;

using

namespace __gnu_cxx;

const

int n = 200000 + 10;

rope *par[n];

int a[n];

int find(int x, int cur)

void unite(int x, int y, int cur)

bool same(int x, int y, int cur)

int main()

else

if(opt == 2)

else

if(opt == 3)

}return

0;}

BZOJ 3674 可持久化並查集

3674 可持久化並查集加強版 time limit 15 sec memory limit 256 mb submit 4051 solved 1503 submit status discuss description description 自從zkysb出了可持久化並查集後 hzwer 亂寫...

bzoj 3674 可持久化並查集)

傳送門 題解 一道可持久化並查集的裸題,板子子對了就能過 可持久化並查集是基於主席數的一種結構,可持久化並查集要求能夠訪問歷史版本,跟主席樹很像,所以可以通過主席樹維護普通並查集的fa陣列,但是由於用主席樹維護後沒有辦法用路徑壓縮,所以需要採用新的合併方式 啟發式合併,對每乙個節點增加乙個level...

BZOJ 3674 可持久化並查集加強版

題意 三種操作 1 合併ab所在集合 2 查詢ab是否在乙個集合 3 狀態回到第x個操作之前。思路 1 每個節點儲存乙個深度 合併時找到兩個節點的根,ra,rb,若ra的深度小,則ra的父親設為rb,否則rb的父親設為ra 2 查詢直接找到兩個的根。這個的複雜度是多少呢?貌似是logn logn。每...