emmmm没想到CFdiv2的F题竟然比前面的两道题简单?(狗头)
题意:给定n个坑,每次可以拆掉一个相邻坑之间的隔板,现给出拆隔板的顺序,要求复原未拆隔板之前的坑的样子。
题解:写个并查集维护一个链式的结构,最后链式输出即可。
hint:要注意进行路径压缩,不然会T。
附上ACcode:
#include <bits/stdc++.h>
#define FOPI freopen("INPUT.TXT", "r", stdin)
#define DOPI freopen("OUTPUT.TXT", "w", stdout)
#define FOR(i, x, y) for(int i = x; i <= y; i ++)
#define ROF(i, x, y) for(int i = x; i >= y; i --)
using namespace std;
typedef long long int ll;
const int ind=0x3f3f3f3f,N=2e5;
int f[N],r[N],p[N];
const ll inlld=0x3f3f3f3f3f3f3f3f,mod=998244353;
int getf(int x)
{
return f[x]==x?x:f[x]=getf(f[x]);
}
int getr(int x)
{
return r[x]==x?x:r[x]=getr(r[x]);
}
void printans(int x)
{
cout << x << ' ';
if(p[x]==x)return ;
else return printans(p[x]);
}
int main()
{
ios::sync_with_stdio(false);
int n,a,b;cin>>n;
for(int i=1;i<=n;i++){
f[i]=r[i]=p[i]=i;
}
for(int i=1;i<=n-1;i++){
cin>>a>>b;
int fa=getf(a),fb=getf(b);
if(fa<fb){
int ra=getr(fa);
r[ra]=fb;
f[fb]=fa;
p[ra]=fb;
}
else {
int rb=getr(fb);
r[rb]=fa;
f[fa]=fb;
p[rb]=fa;
}
}
int fi;
for(int i=1;i<=n;i++){
if(f[i]==i){
fi=i;break;
}
}
printans(fi);
return 0;
}
/*
5
1 4
2 5
3 1
4 5
*/