• [CF1491D] Zookeeper and The Infinite Zoo


    [CF1491D] Zookeeper and The Infinite Zoo - 贪心

    Description

    有一个无限图,其中有无数个节点,从 (1) 开始标号。有一条从 (u)(u+v) 的单向边,当且仅当 (u AND v = v)。有 (q) 个询问,询问是否存在一条从 (u)(v) 的路径。

    Solution

    因为这里只要考虑连通性,显然我们会考虑所有加 2 的幂次的情形

    这个过程相当于把若干个低位的 1 变成一个高位的 1

    所以只需要将 u,v 的 1 贪心匹配,保证大于等于关系即可

    #include <bits/stdc++.h>
    using namespace std;
     
    #define int long long
    const int N = 1000005;
     
    bool solve()
    {
        vector<int> a;
        vector<int> b;
        int p, q;
        cin >> p >> q;
        if (p > q)
            return false;
        for (int i = 0; i < 30; i++)
        {
            if (p & (1 << i))
                a.push_back(i);
            if (q & (1 << i))
                b.push_back(i);
        }
        for (int i = 0; i < b.size(); i++)
        {
            if (i >= a.size() || a[i] > b[i])
                return false;
        }
        return true;
    }
     
    signed main()
    {
        ios::sync_with_stdio(false);
        int t;
        cin >> t;
        while (t--)
        {
            if (solve())
                cout << "YES" << endl;
            else
                cout << "NO" << endl;
        }
    }
    
  • 相关阅读:
    整理一些将窗口显示在前台办法
    工具
    [Windows Api 学习] Error Handling Functions
    Windows实用快捷键
    程序化交易资料汇总
    compile libpng
    zlib 1.2.8 编译笔记
    Cryptopp Usage Note
    linux环境中Java服务通过shell脚本重启(升级)自己
    搭建自己的maven库---nexus
  • 原文地址:https://www.cnblogs.com/mollnn/p/14472806.html
Copyright © 2020-2023  润新知