這是一道嘿嘿嘿oj的題目,內部資料,所以沒有題面。
這道題是lct的板子題,但是蒟蒻不會lct,所以只能用它的弱化版樹剖來做了。
我們先離線讀入所有的操作,對於操作1,我們先連邊,並打標記,如果find(x)==find(y),則在後面的操作就不許要管了,直接continue。對於操作2,我們就判斷x和y是否在同乙個並查集中,如果不在就打標記,後面操作時直接輸-1。
code:
#include#define maxn 200005
#define ll long long
using namespace std;
ll read()
ll n,q,cnt,dfn,head[maxn],nxt[maxn],go[maxn],vis[maxn*3],val[maxn],rt;
ll sum[maxn*4],son[maxn],siz[maxn],dep[maxn],fa[maxn],rank[maxn],tid[maxn],top[maxn];
struct nodeq[maxn*3];
ll find(ll x)
void unionn(ll x,ll y)
void addedge(ll x,ll y)
void dfsi(ll x,ll father)
}void dfsii(ll x,ll t)
}void up(ll node)
void build(ll node,ll l,ll r)
ll mid=(l+r)>>1;
build(node<<1,l,mid);
build(node<<1|1,mid+1,r);
up(node);
}void update(ll node,ll l,ll r,ll p,ll ad)
ll mid=(l+r)>>1;
if(p<=mid) update(node<<1,l,mid,p,ad);
else update(node<<1|1,mid+1,r,p,ad);
up(node);
}ll query(ll node,ll l,ll r,ll l,ll r)
ll mid=(l+r)>>1,res=0;
if(l<=mid) res|=query(node<<1,l,mid,l,r);
if(r>mid) res|=query(node<<1|1,mid+1,r,l,r);
return res;
}ll querylink(ll u,ll v)
if(dep[u]>dep[v]) swap(u,v);
res|=query(1,1,n,tid[u],tid[v]);
while(res)
return tot;
}int main()
;if(type==1)
unionn(x,y);addedge(x,y);
}if(type==2)
}dfsi(1,0);
dfsii(1,1);
build(1,1,n);
for(ll i=1;i<=q;i++)
if(q[i].type==2)
}return
0;}
LCA Tarjin 並查集 離線
以前了解的tarjin演算法是用來求連通分量,在這裡是用來求最近公共祖先 並查集用過,很有意思的工具。kraskal演算法是並查集最經典的應用。首先初始化集合,每個元素為單個集合。集合,我們需要選出乙個代表,這個代表的性質是set u u。一開始乙個集合只有乙個元素,所以該集合的代表也就是該元素。當...
離線 並查集 Mootube
mootube 描述給定一顆n個節點的樹,定義兩點距離為他們之間路徑中邊權最小值。q次詢問k,v,詢問到v距離 k的點有多少 不含v 輸入第一行兩個整數n,q。接下來n 1行,每行3個整數u,v,w表示u,v之間有條路徑,長為w 接下來q組詢問,每組詢問2個整數k,v 輸出q行回答詢問 樣例輸入 4...
題解 history(離線並查集)
今天考試很水,ssw023道題都寫的正解,然而不注重細節。1or 1寫成 1 連通塊最大值不更新 t3就是這道細節題 description 歷史學家小 正在研究乙個奇怪的王國的歷史。當前階段的任務是研究該國的交通。根據這個奇怪的王國的史書記載,史書開始記載前這個王國有 n 個城市 城市從 0 開 ...