CF1944B 题解

异或的性质

  1. xx 异或 xx 等于 00
  2. 00 异或 xxxx

思路

注意题目中说每个数恰好出现 22 次,所以每个数可能在两边各出现一个,这种情况要两边一起选,使结果里多这个数;也可能在同一边出现两次,这样需要把它们两个数一起选,但对这个数不起作用。

代码

# 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;
}
posted @   sz_jinzikai  阅读(6)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示