codeforces(League of Leesins)

题目链接:http://codeforces.com/contest/1255/problem/C
题目大意为,对于一个序列,每相邻的三个数可以组成一个三元组,然后对这个三元组的集合打乱顺序,然后让我们求出原来的序列,
解题思路:我们可以找到这么一个关系,对于给出的三元组中,只出现过一次的数字一定是在原序列中的第一个或者最后一个,只出现过两次的数字只出现在原序列中的第二个或者倒数第二个,中间的数字都出现了三次,那么如果我们从第一个数开始找,将与它处于同一个三元组中的数的出现次数都-1,如果有一个数出现了一次,那么这个是就是这个三元组后面一个三元组的开始元素,但是这种只能处理到前n-2个元素,因为前N-2个元素的出现次数为1,2,3,3,3,3,3…这样的序列,而最后两个元素的出现次数为2,1,当处理到这里的时候,就会出现两个出现次数为1的元素(当减去倒数第二个三元组的所有元素的时候),所以这里我们需要特判一下,然后拓扑排序就可以啦。
代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;
const int maxn=1e6+7;
struct node
{
    int a,b,c;
}t[maxn];
int pos[maxn],num[maxn];
int pre[2][2];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n-2;i++){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        num[a]++,num[b]++,num[c]++;
        pos[a]^=i;
        pos[b]^=i;
        pos[c]^=i;
        t[i]=node{a,b,c};
    }
    int temp=0;
    for(int i=1;i<=n;i++){
        if(num[i]==1){
            int x=pos[i];
            int a=t[x].a,b=t[x].b,c=t[x].c;
            int tp,tf;
            if(num[a]==2){
                tf=a;
            }
            if(num[b]==2){
                tf=b;
            }
            if(num[c]==2){
                tf=c;
            }
            if(temp==0){
                pre[0][0]=i;
                pre[0][1]=tf;
            }
            else{
                pre[1][0]=i;
                pre[1][1]=tf;
            }
            temp=pre[0][0];
        }
    }
    int flag=0;
    n-=2;
    while(n--){
        int now=pos[temp];
        if(flag)printf(" ");
        printf("%d",temp);
        flag=1;
        int a=t[now].a,b=t[now].b,c=t[now].c;
        pos[a]^=now,pos[b]^=now,pos[c]^=now;
        if(--num[a]==1 && a!=pre[1][1]){
            temp=a;
        }
        if(--num[b]==1 && b!=pre[1][1]) temp=b;
        if(--num[c]==1 && c!=pre[1][1]) temp=c;
    }
    printf(" %d %d\n",pre[1][1],pre[1][0]);
    return 0;
}
发布了34 篇原创文章 · 获赞 3 · 访问量 256

猜你喜欢

转载自blog.csdn.net/qq_44641782/article/details/103182298