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; }