Codeforces 1255C League of Leesins
思路:
1.给定序列中,所有数出现的总次数为1的必定排在原序列的第一个或最后一个,由于原序列可以倒序,所以我们取第一个找到的出现次数为1的作为第一个;
2.和第一个数在同一子序列的且出现次数为2的就是第二个数;
3.然后就可以链式地推出后面所有数;
代码:
#define IOS ios::sync_with_stdio(false)
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
typedef long long LL;
typedef vector<int> vec;
#define fi first
#define sc second
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define rp(i,n) for(int i=0;i<n;i++)
#define rpn(i,n) for(int i=1;i<=n;i++)
const int MAX_N=1e5+99;
int arr[MAX_N];
int per[MAX_N];
vector<int> v[MAX_N];
bool in[MAX_N];
int main(){
IOS;
int n;
cin>>n;
rp(i,n-2){
int a,b,c;
cin>>a>>b>>c;
arr[a]++;arr[b]++;arr[c]++;
v[a].pb(b);v[a].pb(c);
v[b].pb(a);v[b].pb(c);
v[c].pb(a);v[c].pb(b);
}
rpn(i,n){
if(arr[i]==1){
per[1]=i;in[i]=1;
for(auto e:v[i]){
if(arr[e]==2){
per[2]=e;
in[e]=1;
}
}
break;
}
}
for(int i=3;i<=n;i++){
for(auto e1:v[per[i-2]]){
for(auto e2:v[per[i-1]]){
if(e1==e2&&!in[e1]){
per[i]=e1;
in[e1]=true;
goto here;
}
}
}
here:;
}
cout<<per[1];
for(int i=2;i<=n;i++) cout<<' '<<per[i];
return 0;
}