原题链接: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;
}