n個集合 m個操作
操作:
1 a b 合併a,b所在集合
2 k 回到第k次操作之後的狀態(查詢算作操作)
3 a b 詢問a,b是否屬於同一集合,是則輸出1否則輸出0
05 6
1 1 2
3 1 2
2 0
3 1 2
2 1
3 1 2
1 0
1可持久化並查集不好寫,我們考慮到並查集的寫法就是查詢父親節點,修改父親節點的指向,單點查詢和修改,我們就可以用主席樹來對它進行維護
#include
#include
#include
#include
#include
using namespace std;
const int n=1e5;
int root[n+100],val[n*20+100],ls[n*20+100],rs[n*20+100];
int cnt,n,m;
intread()
void build(int &k,int l,int r)
int mid=(l+r)>>1;
build(ls[k],l,mid);
build(rs[k],mid+1,r);
}int get(int k,int l,int r,int
x)void add(int &k,int p,int l,int r,int
x,int t)
int mid=(l+r)>>1;
if (x
<=mid) add(ls[k],ls[p],l,mid,x,t);
else add(rs[k],rs[p],mid+1,r,x,t);
}int find(int k,int
x)int main()
if (t==2)
if (t==3)
}return
0;}
bzoj3673 可持久化並查集
bzoj 我們考慮把每個操作建成乙個點 i 對於 1 和 3 操作,連邊 i 1,i 對於 2 操作,連邊 k i,i 容易發現這是一棵樹,並且並查集的操作可以回退,那麼我們直接在樹上dfs,在進入節點 回溯時處理merge split 查詢即可.時間複雜度 o m log n 超短.pragma ...
BZOJ3673 可持久並查集
可以用線段樹維護 每個葉子結點存它父親的位置 查乙個點的父親和正常並查集差不多 記錄每個點的深度 當要相連的兩個點深度相同時 p,q 把q的deep 整體用主席樹維護 copy hzwer的 orz include include using namespace std inline int rea...
bzoj 3673可持久化並查集 by zky
n個集合 m個操作 操作 1 a b 合併a,b所在集合 2 k 回到第k次操作之後的狀態 查詢算作操作 3 a b 詢問a,b是否屬於同一集合,是則輸出1否則輸出0 可持久化並查集模板題 並查集實質是乙個陣列,可持久化並查集就是乙個可持久化陣列,可以用可持久化線段樹維護,本質就是這樣 只有葉子節點...