Zookeeper and The Infinite Zoo

Zookeeper and The Infinite Zoo

对于一个n个点的图,当且仅当\(u\&v=v\)的时候从\(u\)\(u+v\)连接一条有向边。\(q(q\le10^5)\)次询问\(u\)是否能够到达\(v\)

然后与操作这个等式本质上就是\(v\)\(u\)的子集,那么加操作我们如果前面一位是0,那么这个操作就是一个左移操作,然后如果是1,那么就会产生进位。那么我们考虑利用这个来构造解,就是当\(u\)的二进制表示中每一个\(1\)都能够和\(v\)中的一个位置小于等于它的\(1\)匹配,并且\(u<v\),那么就存在解。

然后这道题告诉我们,对于判断性问题,我们还可以利用构造求解,然后构造方案我们只需要考虑一些特殊情况。

#include<bits/stdc++.h>
#define LL long long
#define V inline void
#define I inline int
#define FOR(i,a,b) for(register int i=a,end##i=b;i<=end##i;++i)
#define REP(i,a,b) for(register int i=a,end##i=b;i>=end##i;--i)
#define go(i,x) for(int i=hed[x];i;i=e[i].pre)
using namespace std;
inline int read()
{
	char x='\0';
	int fh=1,sum=0;
	for(x=getchar();x<'0'||x>'9';x=getchar())if(x=='-')fh=-1;
	for(;x>='0'&&x<='9';x=getchar())sum=sum*10+x-'0';
	return fh*sum;
}
int q,u,v;
int main()
{
	q=read();
	FOR(i,1,q)
	{
		int cnt=0;
		u=read(),v=read();
		bool pd=(u<=v);
		FOR(j,0,29)
		{
			if((u>>j)&1)cnt++;
			if((v>>j)&1)cnt--;
			if(cnt<0)pd=false;
		}
		if(pd)printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}


 
posted @ 2021-03-09 20:18  dinlon  阅读(95)  评论(0)    收藏  举报