codeforces 1328 D. Carousel_比赛


codeforces 1328 D. Carousel_比赛_02

题意:

告诉你一个序列,不同的数字代表不同的种类的动物,你需要给每只动物上色,如果相邻两个动物种类不同,那么他们涂的颜色也必须是不同的,如果相同种类相同,则可以涂不同的颜色也可以图相同的颜色。
问最少需要多少种颜色去涂,且输出涂色方案(首尾相连)

分成偶数个和奇数个

  • 偶数个就直接 codeforces 1328 D. Carousel_比赛_03,重复部分颜色相同即可
  • 奇数个又分为有重复和无重复
  • 有重复,某一个重复部分变色一次就和偶数一样了
  • 无重复,也就是 codeforces 1328 D. Carousel_比赛_04

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;
}