zoukankan      html  css  js  c++  java
  • [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;
        }
    }
    
  • 相关阅读:
    SQL Server调优系列基础篇
    SQL分组查询及聚集函数的使用
    数据库索引
    ASP.NET MVC5入门指南
    AOP 动态织入的.NET实现
    mmap学习
    Mysql的优化一则
    PHP 5.5 新特性
    19个三维GIS软件对比
    周鸿祎区块链五大缺点, 区块链的100个问题
  • 原文地址:https://www.cnblogs.com/mollnn/p/14472806.html
Copyright © 2011-2022 走看看