[bzoj4668]冷戰 -按秩合併並查集
阿新 • • 發佈:2020-12-26
題意
動態給點連邊 詢問兩個點之間最早是在第幾個操作連起來的
// 存個板:按秩合併並查集
一些補充(按秩合併):
樹高不會超過logn
可以保留原始的資訊
程式碼
#include <iostream> #include <cstdio> using namespace std; const int maxn=500003; int n,m,las,fa[maxn],edge[maxn],deep[maxn],siz[maxn],tim; int getfa(int x) { if(x==fa[x]) return x; int tf=getfa(fa[x]); deep[x]=deep[fa[x]]+1; return tf; } void merge(int x,int y) { x=getfa(x); y=getfa(y); if(x==y) return; if(siz[x]>siz[y]) swap(x,y); fa[x]=y; siz[y]+=siz[x]; edge[x]=tim; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) fa[i]=i,siz[i]=1; for(int i=1,t0,t1,t2;i<=m;++i) { scanf("%d%d%d",&t0,&t1,&t2); t1^=las; t2^=las; if(!t0) ++tim,merge(t1,t2); else { las=0; int tx=getfa(t1),ty=getfa(t2); if(tx!=ty) {puts("0"); continue;} while(t1!=t2) { if(deep[t1]<deep[t2]) swap(t1,t2); las=max(las,edge[t1]); t1=fa[t1]; } cout<<las<<'\n'; } } return 0; }