• 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;
    }
    
  • 相关阅读:
    poj 2243 bfs 利用 结构体中的step成员保存步数 ,STL的队列
    poj 1915 双向 BFS 利用数组 a[x][y] = a[cp.x][cp.y] + 1; b[x][y] = b[cp.x][cp.y] + 1;保留步数
    poj 1915 BFS 利用 pre 计算步数------------------路径
    hdu 1242
    poj 2243
    rwkj 1502
    png-CRC32校验
    uva-331-枚举-交换的方案数
    uva-301-枚举-组合
    关于docker
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12308838.html
Copyright © 2020-2023  润新知