Codeforces #629 div.3(D. Carousel)

原题链接:https://codeforces.ml/contest/1328/problem/D
算是个模拟题吧
一个多小时没A掉。。。唉。。。最后10分钟弃疗了。。。
像这种情况细节性的题做的还是少了,就是感觉能做但是在做的过程中不断的发现漏掉了一些地方,导致代码一遍遍的改,甚至重写。
其实静下心来仔细捋一捋思路应该差不多,太浮躁了
总而言之题也还是做少了

首先要知道最多只涂三种颜色
涂一种颜色时当且仅当所有图形都一样
涂三钟颜色当且仅当没有任何两个连着的图形一样,且总个数为奇数个
其余情况涂两种颜色即可

代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;

ll a[300005],d[300005];
ll book[300005];
int main()
{
    ll t,n,lpl=0;
    scanf("%lld",&t);
    while(t--)
    {
        lpl++;
        scanf("%lld",&n);
        for(int i=1;i<=n;i++)
        {scanf("%lld",&a[i]);}
        ll cnt=0;
        for(int i=1;i<=n;i++)
        {
            if(book[a[i]]!=lpl)
            {book[a[i]]=lpl;
            cnt++;}
        }
        if(cnt==1)
        {
            cout<<"1"<<endl;
            for(int i=1;i<=n;i++)
            {cout<<"1 ";}
            cout<<endl;continue;
        }
        if(cnt==2)
        {
            cout<<"2"<<endl;
            d[1]=1;cout<<d[1]<<" ";
            for(int i=2;i<=n;i++)
            {
                if(a[i]==a[i-1])
                {d[i]=d[i-1];}
                else
                {d[i]=d[i-1]==1?2:1;}
                cout<<d[i]<<" ";
            }
            cout<<endl;
            continue;
        }
        ll flag=0,posa,posb;
        for(int i=1;i<=n;i++)
        {
            if(i==1)
            {if(a[1]==a[n]){flag=2;break;}}
            if(a[i]==a[i-1])
            {flag=1;
            posa=i-1;posb=i;break;}
        }
        if(flag==0)
        {
            if(n%2==0)
            {
                cout<<"2"<<endl;
                for(int i=1;i<=n;i++)
                {
                    if(i%2!=0){cout<<"1 ";}
                    else{cout<<"2 ";}
                }
                cout<<endl;
            }
            else
            {
                cout<<"3"<<endl;
                for(int i=1;i<n;i++)
                {
                    if(i%2!=0){cout<<"1 ";}
                    else{cout<<"2 ";}
                }
                cout<<"3"<<endl;
            }
        }
        if(flag==2)
        {
            cout<<"2"<<endl;
            d[1]=1;cout<<d[1]<<" ";
            for(int i=2;i<=n;i++)
            {
                if(a[i]==a[i-1]){d[i]=d[i-1];}
                else{d[i]=d[i-1]==1?2:1;}
                cout<<d[i]<<" ";
            }
            cout<<endl;
        }
        if(flag==1)
        {
            cout<<"2"<<endl;
            d[1]=1;
            for(int i=2;i<=posa;i++)
            {
                if(a[i]==a[i-1]){d[i]=d[i-1];}
                else{d[i]=d[i-1]==1?2:1;}
            }
            d[n]=2;
            for(int i=n-1;i>=posb;i--)
            {
                if(a[i]==a[i+1]){d[i]=d[i+1];}
                else{d[i]=d[i+1]==1?2:1;}
            }
            for(int i=1;i<=n;i++)
            {cout<<d[i]<<" ";}
            cout<<endl;
        }
    }
    return 0;
}

发布了36 篇原创文章 · 获赞 4 · 访问量 1374

猜你喜欢

转载自blog.csdn.net/qq_43781431/article/details/105144868