专栏文章

题解:CF2153B Bitwise Reversion

CF2153B题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minm8scv
此快照首次捕获于
2025/12/02 04:42
3 个月前
此快照最后确认于
2025/12/02 04:42
3 个月前
查看原文

Part 1 题意

现在,也就是说给了我们三个数 xxyyzz,其中 a&b=xa \mathbin{\&} b = x b&c=yb \mathbin{\&} c = y a&c=za \mathbin{\&} c = z 我们需要判断是否存在 xxyyzz 使得它们满足上面的条件。

Part 2 思路

我们考虑一下按位与运算的性质,当且仅当 1&1=11 \mathbin{\&} 1 = 1
我们按照二进制位来考虑,设 ppxx 从右往左数二进制第 ii 位的值。同理,我们也设 qqrr 分别为 yyzz 从右往左数二进制第 ii 位的值。
我们来分情况讨论一下:
  • p=0p = 0q=0q = 0r=0r = 0。很明显,我们会发现这样一定是存在合法方案的。因为只要 aabbcc 这位上都是 00 即可。
  • p=0p = 0q=0q = 0r=1r = 1。我们发现 r=1r = 1,也就是说 xxzz 这位上都是 11。只要 yy 这一位上是 00 即可。
  • p=1p = 1q=0q = 0r=1r = 1。我们发现,这种其实是不合法的方案。为什么呢?因为 p=1p = 1r=1r = 1,说明这一位上 aabbcc 上都是 11。那么,在这种情况下,qq 的值也一定是 11,但是这里给出的是 00,所以不合法。
通过上面举出的三个例子,我们可以发现规律:
只要 ppqqrr 这三个数里面有两个是 11,那么这一定是不合法方案,因为这就代表了三个数这一位上都是 11,不可能有一个出现 00。只要所有的 ii 都是合法的,那么存在一种合法方案。

Part 3 代码

CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

ll x, y, z;

void work() {
	cin >> x >> y >> z;
	for (ll i = 0; i <= 31; i ++) {
		ll a = ((x >> i) & 1), b = ((y >> i) & 1), c = ((z >> i) & 1);
//		cout << "i = " << i << " a = " << a << " b = " << b << " c = " << c << " \n";
		if (a == 0 && b == 1 && c == 1) {
			cout << "NO\n";
			return ;
		} 
		if (a == 1 && b == 1 && c == 0) {
			cout << "NO\n";
			return ;
		}
		if (a == 1 && b == 0 && c == 1) {
			cout << "NO\n";
			return ;
		}
	}
	cout << "YES\n";
}

int main() {
	
	int _; cin >> _;
	while (_ --) work();
	
	return 0;
} 
这里解释一下代码,代码中的 aabbcc 分别对应着上面的 ppqqrr
总复杂度应该是 O(TlogV)O(T \log V)TT 表示测试组数,VV 表示 max(a,b,c)\max(a, b, c)

评论

0 条评论,欢迎与作者交流。

正在加载评论...