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

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章