用并查集维护哪些猫连通;
每个连通块需要记录左端点,右端点;
对于每各点来说还要维护他的下一个点;
x y
|————| |———|
l1 r1 l2 r2
将x y区间合并时 f[y]=x;
还要将 r1.nxt=l2;
再将r1=r2;
合并后区间
xy
|—————————|
l1 r2
#include<bits/stdc++.h> using namespace std; const int maxn=2e5+10; int f[maxn]; deque<int>q; struct node{ int l,r,nxt; }e[maxn];///左端 右端 下一个点 int root(int x) { return f[x]=(f[x]==x?x:root(f[x])); } int main() { int n; cin>>n; for(int i=1;i<=n;i++) f[i]=e[i].l=e[i].r=i; for(int i=1;i<n;i++) { int x,y; cin>>x>>y; x=root(x),y=root(y); f[x]=y;///合并区间 e[e[y].r].nxt=e[x].l;///将y右区间的下一个点 指向x区间的左端 e[y].r=e[x].r;///将y区间右更新成x的右端 } int st=e[root(1)].l;///起点 while(st) { cout<<st<<" "; st=e[st].nxt; } return 0; }