CF1944B 题解
异或的性质
- 异或 等于 ;
- 异或 是 。
思路
注意题目中说每个数恰好出现 次,所以每个数可能在两边各出现一个,这种情况要两边一起选,使结果里多这个数;也可能在同一边出现两次,这样需要把它们两个数一起选,但对这个数不起作用。
代码
# include <bits/stdc++.h>
using namespace std;
int t, n, x, k, v1[50005], v2[50005], tot1, tot2;
bitset <50005> vis1, vis2;
int main () {
ios::sync_with_stdio (0);
cin.tie (0);
cout.tie (0);
cin >> t;
while (t --) {
cin >> n >> k;
for (int i = 1; i <= n; ++ i)
vis1[i] = vis2[i] = 0;
for (int i = 1; i <= n; ++ i)
cin >> x, vis1[x] = 1;
for (int i = 1; i <= n; ++ i)
cin >> x, vis2[x] = 1;
tot1 = tot2 = 0;
for (int i = 1; i <= n; ++ i)
if (vis1[i] && ! vis2[i])
v1[++ tot1] = i;
else if (vis2[i] && ! vis1[i])
v2[++ tot2] = i;
if (tot1 >= k) {
for (int i = 1; i <= k; ++ i)
cout << v1[i] << ' ' << v1[i] << ' ';
cout << '\n';
for (int i = 1; i <= k; ++ i)
cout << v2[i] << ' ' << v2[i] << ' ';
cout << '\n';
} else {
for (int i = 1; i <= n; ++ i)
if (vis1[i] && vis2[i])
++ tot2, v1[tot2] = v2[tot2] = i;
tot2 = k * 2 - tot1;
for (int i = 1; i <= tot1; ++ i)
cout << v1[i] << ' ' << v1[i] << ' ';
for (int i = tot1 + 1; i <= tot2; ++ i)
cout << v1[i] << ' ';
cout << '\n';
for (int i = 1; i <= tot1; ++ i)
cout << v2[i] << ' ' << v2[i] << ' ';
for (int i = tot1 + 1; i <= tot2; ++ i)
cout << v2[i] << ' ';
cout << '\n';
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律