bzoj3673 可持久化並查集

2022-07-22 05:51:09 字數 1010 閱讀 1319

bzoj

我們考慮把每個操作建成乙個點 \(i\).

對於 \(1\) 和 \(3\) 操作, 連邊 \((i-1, i)\);

對於 \(2\) 操作, 連邊 \((k_i, i)\).

容易發現這是一棵樹, 並且並查集的操作可以回退, 那麼我們直接在樹上dfs, 在進入節點/回溯時處理merge/split/查詢即可.

時間複雜度 \(o(m \log n)\)

**超短...

#pragma gcc diagnostic error "-std=c++11"

#include#include#include#include#include#include#include#includeusing namespace std;

#define rep(i,l,r) for(register int i=(l);i<=(r);++i)

#define repdo(i,l,r) for(register int i=(l);i>=(r);--i)

#define il inline

typedef double db;

typedef long long ll;

//---------------------------------------

const int nsz=2e4+50;

int n,m,ans[nsz],las;

int fa[nsz],dep[nsz];

int stk[nsz][2],top=0;

void init()

int find(int p)

int iscon(int a,int b)

void merge(int a,int b)

void dfs(int p)

del(top1);

}int main()

dfs(0);

rep(i,1,m)if(qu[i].ty==3)cout

}

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 05 6 1 1 2 3 1 2 2 0 3 1 2 2 1 3 1 2 1 0 1可持久化並查集不好寫,我們考慮到並查集的寫法就是...

bzoj 3673可持久化並查集 by zky

n個集合 m個操作 操作 1 a b 合併a,b所在集合 2 k 回到第k次操作之後的狀態 查詢算作操作 3 a b 詢問a,b是否屬於同一集合,是則輸出1否則輸出0 可持久化並查集模板題 並查集實質是乙個陣列,可持久化並查集就是乙個可持久化陣列,可以用可持久化線段樹維護,本質就是這樣 只有葉子節點...