Codeforces Round #629 (Div. 3) D. Carousel (贪心)




下面是AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int a[N],t,n,fi,be; //a[i]储存答案 fi(first)表示第一个数 ,be(before)表示当前数的前一个数. 
int main(){
	cin>>t;
	while(t--){
		cin>>n;
		cin>>fi;
		int vis=0,k=1;//初始颜色种类k=1. 
		a[1]=1;//a[1]默认为1 
		be=fi; 
		for(int i=2,x;i<=n;i++){
			cin>>x;
			if(x==be) a[i]=a[i-1],vis=i;//vis标记相同的最后一对的位置. 
			else a[i]=3-a[i-1],k=2;
			be=x; //更新 
		}
		if(fi!=be&&a[1]==a[n]){ //特判 
			if(vis){//改变颜色顺序. 
				for(int i=vis;i<=n;i++)
					a[i]=3-a[i];
			}
			else a[n]=3,k=3; 
		}
		cout<<k<<endl;
		for(int i=1;i<=n;i++) printf(i==n?"%d\n":"%d ",a[i]); 
	}
	return 0;
}