二进制永远的神
题解:
如果 u 到 u + v 中有一条边,那么 u & v = v,
那么证明二进制 v 为 1 的位 u 也为 1。
u + v 的时候, 如果两位全为 1 的话,高位进位,该位变0。
不全为1的时候,该位为1。
总结一下: u中1的位置 一定比 u+v中1的位置 低或相等,照着这个规律去判断两个数字之间有没有边即可。
还有就是别忘了 只能向比自己大的值连边。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define ll long long
const int N = 100010;
int lowbit(int x) {
return x&(-x);
}
int n;
int l, r;
int yes(){
int l1 = 0, r1 = 0;
for(int i = 0;i < 30;i ++) {
if(l & 1) l1 ++;
if(r&1) {
if(l1 == 0) return false;
l1 --;
}
l >>= 1;
r >>= 1;
}
return true;
}
int main(){
scanf("%d",&n);
while(n --) {
scanf("%d%d",&l,&r);
if(l <= r && yes()) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}