codeforces 1328 D. Carousel
原创
©著作权归作者所有:来自51CTO博客作者wx63db9cf49ed95的原创作品,请联系作者获取转载授权,否则将追究法律责任


题意:
告诉你一个序列,不同的数字代表不同的种类的动物,你需要给每只动物上色,如果相邻两个动物种类不同,那么他们涂的颜色也必须是不同的,如果相同种类相同,则可以涂不同的颜色也可以图相同的颜色。
问最少需要多少种颜色去涂,且输出涂色方案(首尾相连)
分成偶数个和奇数个
- 偶数个就直接
,重复部分颜色相同即可 - 奇数个又分为有重复和无重复
- 有重复,某一个重复部分变色一次就和偶数一样了
- 无重复,也就是

AC代码:
const int N = 2e5+10;
int a[N];
int n, m;
int maxx, res, tmp, pos;
int main()
{
int t;
sd(t);
while (t--)
{
maxx = 1;
res = 0;
tmp = 0;
sd(n);
rep(i, 1, n)
sd(a[i]);
a[n + 1] = a[1];
a[0] = a[n];
rep(i, 1, n)
{
if (a[i] == a[i + 1])
res = 1;
else
tmp = 1;
}
if (res == 1 && tmp == 0)
{
puts("1");
rep(i, 1, n)
{
printf("1 ");
}
printf("\n");
}
else if (res == 1 && tmp == 1)
{
puts("2");
if (n % 2 == 0)
{
rep(i, 1, n)
{
if (i % 2 == 1)
printf("1 ");
else
printf("2 ");
}
}
else
{
res = 2;
tmp = 0;
rep(i, 1, n)
{
if (a[i] == a[i - 1] && tmp == 0)
{
printf("%d ", res);
tmp = 1;
}
else
{
if (res == 2)
{
printf("1 ");
res = 1;
}
else
{
printf("2 ");
res = 2;
}
}
}
}
printf("\n");
}
else
{
if (n % 2 == 0)
{
puts("2");
rep(i, 1, n)
{
if (i % 2 == 1)
printf("1 ");
else
printf("2 ");
}
}
else
{
puts("3");
rep(i, 1, n - 1)
{
if (i % 2 == 1)
printf("1 ");
else
printf("2 ");
}
printf("3 ");
}
printf("\n");
}
}
return 0;
}