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;
}
原文地址:https://www.cnblogs.com/yuhan-blog/p/12308838.html