CF1918C 题解

思路

因为最后求的是绝对值,所以我首先使计算过程中 aa 始终比 bb 大。

aia_i 表示 aa 的二进制第 ii 位上的数字,bib_i 表示 bb 的二进制第 ii 位上的数字,若 ai=bia_i=b_i,则 xx 包不包含 2i2^i 都无所谓,不如不选;若把 ii 从大到小枚举,ai=1a_i=1bi=0b_i=0,此时如果 rr 还够用且异或后 a>ba>b 则选上,并把 r2ir-2^i

代码

# include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int t;
ll a, b, r;
int main () {
	ios::sync_with_stdio (0);
	cin.tie (0);
	cout.tie (0);
	cin >> t;
	while (t --) {
		cin >> a >> b >> r;
		if (a < b)
			swap (a, b);
		for (int i = 62; ~i; -- i)
			if ((1ll << i) <= r && (1ll << i & a) && ! (1ll << i & b) && (a ^ (1ll << i)) >= (b ^ (1ll << i)))
				a ^= 1ll << i, b ^= 1ll << i, r -= 1ll << i;
		cout << a - b << '\n';
	}
	return 0;
}
posted @ 2024-04-27 15:32  Vitamin_B  阅读(12)  评论(0)    收藏  举报  来源