CF814B An express train to reveries
注意本题输出的是排列而非序列!
考虑分类讨论,设 表示 ,即 的 的个数, 表示答案。
若 ,那么对于 ,则 ,对于唯一一个 ,只需要从 到 循环,找到一个 为 的 ,那么 , 表示 在答案排列中出现次数。
若 ,那么对于 ,则 ,对于两个 ,设这两个 分别为 和 ,分别测试 或 ,找出可行解即可。
代码:
#pragma GCC optimize("-Ofast")
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1005;
int n, a[N], b[N], cnt, cnts[N], ans[N];
inline int read()
{
register char ch(getchar());
register int x(0);
while (ch < '0' || ch > '9') ch = getchar();
while (ch >= '0' and ch <= '9')
{
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x;
}
int main()
{
n = read();
for (int i = 1; i <= n; i++) a[i] = read();
for (int i = 1; i <= n; i++)
{
b[i] = read();
cnt += a[i] != b[i];
}
if (cnt == 1)
{
for (int i = 1; i <= n; i++)
{
if (a[i] == b[i]) ans[i] = a[i], cnts[a[i]]++;
}
for (int i = 1; i <= n; i++)
{
if (a[i] != b[i])
{
for (int j = 1; j <= n; j++)
{
if (!cnts[j])
{
ans[i] = j;
break;
}
}
}
}
}
else if (cnt == 2)
{
bool f = false;
for (register int i = 1; i <= n; i++)
{
if (a[i] == b[i]) ans[i] = a[i], cnts[a[i]]++;
}
for (register int i = 1; i <= n; i++)
{
if (a[i] != b[i])
{
if (!cnts[a[i]])
{
ans[i] = a[i];
cnts[a[i]]++;
}
else
{
if (!cnts[b[i]])
{
ans[i] = b[i];
cnts[b[i]]++;
}
else
{
for (int j = i - 1; j >= 1; j--)
{
if (a[j] != b[j])
{
if (ans[j] == a[j])
{
cnts[a[j]]--;
ans[j] = b[j];
}
else ans[j] = a[j], cnts[b[j]]--;
break;
}
}
if (!cnts[b[i]])
{
ans[i] = b[i];
cnts[b[i]]++;
}
else if (!cnts[a[i]])
{
ans[i] = a[i];
cnts[a[i]]++;
}
}
}
}
}
}
for (int i = 1; i <= n; i++) printf("%d ", ans[i]);
putchar('\n');
return 0;
}

浙公网安备 33010602011771号