码迷,mamicode.com
首页 > 其他好文 > 详细

CF1328D Carousel

时间:2021-04-19 15:33:58      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:def   cstring   type   lld   class   颜色不同   ret   math   存在   

原题链接

  • 题意:在一个环中,给每个数涂色,要求不同的相邻的数字颜色不同。
  • 题解:很显然的是,偶数只要是 \(121212\) 就可以保证都不相同,如果是奇数环,那么要小心头尾会相遇,那么如果还是 \(1212\) 那么如果 \(a_{n-1}\)\(a_{1}\)\(\neq a_{n}\) 那么确实会多一个,但是如果有存在两个相同的,那么把他俩染色了,就会 \(12112\) 那么最后一个无论如何都是合法的。所以首先,先判能不能一个颜色都染好,然后在判是否是奇数,然后在判奇数中存不存在有两个数相邻且相等。
  • 代码:
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const ll N = 1e6 + 9, mod = 1e9 + 7;
ll a[N];
ll ans[N];
ll b[N];
void solve() {
    int n;scanf("%d", &n);
    for (int i = 1; i <= n; i ++) scanf("%lld", &a[i]), a[i + n] = a[i];
    for (int i = 2; i <= n; i ++) {
        if (a[i] != a[i-1])break;
        if (i ==n) {
            cout << 1 << endl;
            for (int i = 1; i <= n; i ++)cout << 1 << " ";
            cout << endl;return;
        }
        
    }
    ans[1] = 0;
    ll d = 0;
    for (int i = 1; i <= n; i ++) {
        ans[i] = ans[i-1]^1;
    } 
    int f = 0;
    for (int i = 2; i <= n; i ++) {
        if (a[i] == a[i-1]) {f = i;break;}
    }
    if(f && n%2) {
        ans[f-1] = ans[f] = 0;
        for (int i = f - 2; i >= 1; i--) {
            ans[i] = ans[i + 1] ^ 1;
        }
        for (int i = f + 1; i <= n; i++) {
            ans[i] = ans[i - 1] ^ 1;
        }
    } else if (n % 2){
        if (a[1]  != a[n] && a[n-1] != a[n]) {
            ans[n] = 2;
        }
    }
    cout << max(ans[n] + 1, (ll)2) << endl;

    for (int i = 1; i <= n; i ++) {
        cout << ans[i] + 1 << " ";
    }
    cout << endl;
}
signed main() {
    int t;scanf("%d", &t);
    while (t--) {
        solve();
    }
}

CF1328D Carousel

标签:def   cstring   type   lld   class   颜色不同   ret   math   存在   

原文地址:https://www.cnblogs.com/Xiao-yan/p/14669631.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!