Codeforces Global Round 13 D. Zookeeper and The Infinite Zoo 思维

Codeforces Global Round 13 D. Zookeeper and The Infinite Zoo 思维


传送门:

题意

给 u 和 v , 问 u 能 不 能 到 达 v 。 给u和v,问u能不能到达v。 uvuv
u 能 到 达 u + v 的 条 件 是 u & v = v 。 u能到达u+v的条件是u\&v=v。 uu+vu&v=v

思路

因 为 u 到 u + v 的 条 件 是 u & v = v 。 & 和 二 进 制 有 关 , 所 以 比 较 u 和 v 的 二 进 制 。 因为u到u+v的条件是u\&v=v。\& 和二进制有关,所以比较u和v的二进制。 uu+vu&v=v&uv

如 果 u > v , 那 u 绝 对 到 不 了 v 。 如果u>v,那u绝对到不了v。 u>vuv
如 果 u = = v , e m m m , 不 用 动 就 能 到 达 。 如果u==v,emmm,不用动就能到达。 u==vemmm

先 给 结 论 : 计 算 u 和 v 的 二 进 制 中 1 的 个 数 , 做 一 个 前 缀 和 , 对 于 每 一 位 必 须 a [ i ] > = b [ i ] 能 保 证 u 到 v 。 先给结论:\red{计算u和v的二进制中1的个数,做一个前缀和,对于每一位必须a[i]>=b[i]能保证u到v。} uv1a[i]>=b[i]uv

e g : 对 于 3 , ( 3 ) 2 = 11 , 所 以 1 , 10 , 11 , 3 可 以 到 达 3 + 1 , 3 + 2 , 3 + 3. eg:对于3,(3)_2=11,所以1,10,11,3可以到达3+1,3+2,3+3. eg3(3)2=111101133+13+2,3+3.
e g : 对 于 6 , ( 6 ) 2 = 110 , 所 以 10 , 100 , 110 , 6 可 以 到 达 6 + 2 , 6 + 4 , 6 + 6 , 而 6 到 达 不 了 111. eg:对于6,(6)_2=110,所以10,100,110,6可以到达6+2,6+4,6+6,而6到达不了111. eg6(6)2=1101010011066+26+46+66111.
就 是 因 为 6 的 第 一 位 是 0 , 7 的 第 一 位 是 1 , 已 经 不 能 满 足 结 论 了 。 就是因为6的第一位是0,7的第一位是1,已经不能满足结论了。 6071

Code

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

typedef long long ll;

void solve() {
    int _; cin >> _;
    while(_--) {
        ll u, v; cin >> u >> v;
        vector<int> a(100, 0), b(100, 0);
        for(int i = 0;i <= 30; i++) {
            a[i] = u >> i & 1;
            b[i] = v >> i & 1;
        }
        for(int i = 1;i <= 30; i++) {
            a[i] += a[i - 1];
            b[i] += b[i - 1];
        }
        if(u > v) cout << "NO" << endl;
        else if(u == v) cout << "YES" << endl;
        else {
            bool flag = 1;
            for (int i = 0; i <= 30; i++) {
                if (a[i] < b[i]) {
                    flag = 0;
                    break;
                }
            }
            if (flag) cout << "YES" << endl;
            else cout << "NO" << endl;
        }
    }
}

signed main() {
    solve();
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值