• C


    题意就是给多个三元组(内部没有顺序),让你构造一个序列,使得所有的三元组都是存在的

    简单的思考后就会发现一个简单的思路,开头的数一定只出现一次,进而可以找到头或者尾部的第一个三元组,然后我们知道序列最开始的元素是什么,但是后面两个我们并不知道,两个的顺序是什么,但是我们知道,两个相邻的元素,可以找到连与其相邻的两个元素,然后就很简单了,每次查找下一个元素,然后看前面两个元素中,与第三个元素是否是相邻的,用map瞎搞就行,但是要注意代码的交叉覆盖

       

    #include <bits/stdc++.h>
    #define LL long long
    #define pii pair<int,int>
    #define rep(i,j,k) for(int i=j;i<=k;i++)
    #define per(i,j,k) for(int i=j;i>=k;i--)
    #define mp make_pair
    using namespace std;
    const int maxx =2e5+6;
    map<pii,int>p;
    map<pii,int>pp;
    int vis[maxx];
    int ar[maxx][3];
    vector<int>ans;
    int main(){
        int n;
        scanf("%d",&n);
        p.clear();
        int a,b,c;
        memset(vis,0,sizeof(vis));
        rep(i,1,n-2){
            scanf("%d%d%d",&ar[i][0],&ar[i][1],&ar[i][2]);
            a=ar[i][0];
            b=ar[i][1];
            c=ar[i][2];
            if(p[mp(min(a,b),max(a,b))]==0){
                p[mp(min(a,b),max(a,b))]=c;
            }else {
                pp[mp(min(a,b),max(a,b))]=c;
            }
            if (p[mp(min(a,c),max(a,c))]==0){
                p[mp(min(a,c),max(a,c))]=b;
            }else {
                pp[mp(min(a,c),max(a,c))]=b;
            }
            if (p[mp(min(b,c),max(b,c))]==0){
                p[mp(min(c,b),max(c,b))]=a;
            }else {
                pp[mp(min(c,b),max(c,b))]=a;
            }
            vis[a]++;
            vis[b]++;
            vis[c]++;
        }
        int st=0;
        for (int i=1;i<=n;i++){
            if (vis[ar[i][0]]==1){
                a=ar[i][1];
                b=ar[i][2];
                st=ar[i][0];
                break;
            }else if (vis[ar[i][1]]==1){
                a=ar[i][0];
                b=ar[i][2];
                st=ar[i][1];
                break;
            }else if(vis[ar[i][2]]==1){
                a=ar[i][0];
                b=ar[i][1];
                st=ar[i][2];
                break;
            }
        }
        ans.push_back(st);
        if (pp[mp(min(a,b),max(a,b))]==st){
            c=p[mp(min(a,b),max(a,b))];
        }else {
            c=pp[mp(min(a,b),max(a,b))];
        }
        int cc;
        for (int i=1;i<=n-4;i++){
            if (pp[mp(min(a,c),max(a,c))]!=0){
                ans.push_back(b);
                if (pp[mp(min(a,c),max(a,c))]==b){
                    cc=c;
                    //这里要把c提出来,因为后面c已经改变的了,但是我们还是要用这个原来的值
                    c=p[mp(min(a,cc),max(a,cc))];
                    b=cc;
                    a=a;
                }else {
                    cc=c;
                    c=pp[mp(min(a,cc),max(a,cc))];
                    b=cc;
                    a=a;
                }
            }else {
                ans.push_back(a);
                if (pp[mp(min(b, c), max(b, c))]==a) {
                    cc=c;
                    c = p[mp(min(b, cc), max(b, cc))];
                    a = b;
                    b = cc;
                }else {
                    cc=c;
                    c = pp[mp(min(b, cc), max(b, cc))];
                    a = b;
                    b = cc;
                }
            }
        }
        if (p[mp(min(b,c),max(b,c))]){
            ans.push_back(a);
            if (vis[b]==1){
                ans.push_back(c);
                ans.push_back(b);
            }else {
                ans.push_back(b);
                ans.push_back(c);
            }
        }else {
            ans.push_back(b);
            if (vis[a]==1){
                ans.push_back(c);
                ans.push_back(a);
            }else{
                ans.push_back(a);
                ans.push_back(c);
            }
        }
    
        for (auto it:ans){
            printf("%d ",it);
        }
        cout<<endl;
        return 0;
    }
    /*
    5
    4 1 2
    4 3 2
    2 3 5
     * */
  • 相关阅读:
    Windows--查看端口占用
    设计模式--策略模式--简记
    Java--运算符的优先级表
    乐观锁和悲观锁--简记
    设计模式--适配器模式--简记
    设计模式--建造者模式--简记
    设计模式--抽象工厂模式--简记
    设计模式--工厂方法模式--简记
    寒假学习进度
    程序员修炼之道--从小工到专家阅读笔记03
  • 原文地址:https://www.cnblogs.com/bluefly-hrbust/p/11944924.html
Copyright © 2020-2023  润新知