CF814B An express train to reveries

注意本题输出的是排列而非序列!

考虑分类讨论,设 cc 表示 i=1n[aibi]\sum_{i=1}^n [a_i \neq b_i],即 aibia_i \neq b_iii 的个数,ansians_i 表示答案。

c=1c = 1,那么对于 ai=bia_i = b_i,则 ansi=aians_i = a_i,对于唯一一个 aibia_i \neq b_i,只需要从 11nn 循环,找到一个 cntjcnt_j00jj,那么 ansi=jans_i = jcnticnt_i 表示 ii 在答案排列中出现次数。

c=2c = 2,那么对于 ai=bia_i = b_i,则 ansi=aians_i = a_i,对于两个 aibia_i \neq b_i,设这两个 ii 分别为 xxyy,分别测试 ansx=axans_x = a_xansx=bxans_x = b_x,找出可行解即可。

代码:

#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;
}
posted @   HappyBobb  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示