D. Zookeeper and The Infinite Zoo

题意:
u能直达u + v当且仅当 u&v = v(记住是有向边不是无向边)
然后问你 a 是否可以到达 b ,不一定是直达,但可以经过中间点到达
分析:
其实如果没做过或者对位运算不敏感只能对着数据写出他们的二进制,找规律并且大胆猜想。
人类之所以发现很多东西,就是不断地猜想,不断测试知道多数情况都符合我没看到的现象才认为可行

1.首先当a > b是不可以到达的 ,并且a == b是肯定能到达自己的。
2.你写出样例的二进制,对能到达的点对,对比二进制,你也许可以发现:
从左往右统计目前为止a,b二进制为1的位置个数,假设是ca和cb, 只要有某一时刻ca < cb肯定是不能从a到达b的

证明:
因为u + v当且仅当 u&v = v,我们发现一定可以通过符合条件的加法让低位上的 1 变到高位上的 1,并且二进制中 1 的数量只能变少不能变多,

代码:

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int t,a,b;
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	cin >> t;
	while(t--)
	{
		cin >> a >> b;
		int x = 0;
		bool flag = 1;
		if(a > b) flag = 0;
		for(int i = 0;i < 31 && flag;i++)
		{
			if(a >> i & 1) x++;
			if(b >> i & 1) x--;
			if(x < 0)
			{
				flag = 0;
				break;
			}
		}
		if(flag) cout << "Yes" << endl;
		else cout << "No" << endl;
	}
	return 0;
}

  

posted @ 2021-03-11 15:09  ChunhaoMo  阅读(63)  评论(0编辑  收藏  举报