CF1328D Carousel
2021/4/17 10:56:37
本文主要是介绍CF1328D Carousel,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
原题链接
- 题意:在一个环中,给每个数涂色,要求不同的相邻的数字颜色不同。
- 题解:很显然的是,偶数只要是 \(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的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27Sealos Devbox 基础教程:使用 Cursor 从零开发一个 One API 替代品 审核中
- 2024-12-27TypeScript面试真题解析与实战指南
- 2024-12-27TypeScript大厂面试真题详解与解析
- 2024-12-26怎么使用nsenter命令进入容器?-icode9专业技术文章分享
- 2024-12-26导入文件提示存在乱码,请确定使用的是UTF-8编码怎么解决?-icode9专业技术文章分享
- 2024-12-26csv文件怎么设置编码?-icode9专业技术文章分享
- 2024-12-25TypeScript基础知识详解
- 2024-12-25安卓NDK 是什么?-icode9专业技术文章分享
- 2024-12-25caddy 可以定义日志到 文件吗?-icode9专业技术文章分享
- 2024-12-25wordfence如何设置密码规则?-icode9专业技术文章分享