CF1918C 题解
思路
因为最后求的是绝对值,所以我首先使计算过程中 始终比 大。
设 表示 的二进制第 位上的数字, 表示 的二进制第 位上的数字,若 ,则 包不包含 都无所谓,不如不选;若把 从大到小枚举, 且 ,此时如果 还够用且异或后 则选上,并把 。
代码
# 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;
}

浙公网安备 33010602011771号