D. Carousel
題意:
n個數字圍成一個環,現在要求對n個數進行染色。
染色要求是,對於相鄰的兩個數,如果不同的話,要求顏色也要不一樣。那麼如果相鄰兩個數相同,顏色可以不同,也可以相同。
思路:
一、如果所有數字都一樣的話,只需要染上同一種顏色即可。
二、如果數字的個數有偶數個,那麼只需要兩種顏色,按照1 2 1 2…1 2 1 2這樣染色即可。
三、如果數字的個數有奇數個,去看遍歷一下這個環,看是不是有相鄰的數字是一樣的,如果有,我們只需要對其中一組相鄰的數字染上同一種顏色,對於剩下的繼續按照1 2 1 2…1 2 1 2染色即可。其實這樣等價是把奇數個數字變成了意義上的偶數個。(注意這是個環,第一個數字和最後一個數字也是相鄰的 需要特判下)
如果不存在相鄰的相同數字的話,則需要三種顏色,按照1 2 1 2…1 2 1 2染色,最後一個數字染色爲2。
#include<bits/stdc++.h>
using namespace std;
int a[1<<18];
int main(){
int t;cin>>t;
while(t--){
int n;cin>>n;
set<int> s;
for(int i=1;i<=n;i++) cin>>a[i],s.insert(a[i]);
if(s.size()==1){
cout<<1<<endl;
while(n--) cout<<"1 ";
}
else if(n%2==0)
{
cout<<2<<endl;
for(int i=1;i<=n/2;i++) cout<<"1 2 ";
}
else
{
int flag=0;
for(int i=1;i<=n;i++)
if(a[i]==a[i-1]) {
flag=1;break;
}
if(a[n]==a[1]) flag=1;
if(flag){
cout<<2<<endl;
flag=0;
int k=1;
for(int i=1;i<=n;i++){
if(!flag && a[i]==a[i-1]){
k^=3;
flag=1;
}
cout<<k<<" ";
k^=3;
}
}
else {
cout<<3<<endl;
for(int i=1;i<=n/2;i++) cout<<"1 2 ";
cout<<3;
}
}
cout<<endl;
}
return 0;
}