CF1491D(思维,位运算)
CF1491D(思维,位运算)
题意
一个无限大的有向图,按如下方式建边,问 是否可达 。
- 当 时建立一条从 到 的边
思路
显然可达保证 。
之后就没法一眼了,画图考虑一些特殊点。
画个图可以发现, 的幂次只能走到二的幂次。进而我们想到,将建边方式看成一种移位方式,每次都可能将某位 左移一位或者不动。也就是形如 的变化。
之后又发现,一些非 的整数幂也可以到 的幂次上,如 。我们发现对于多个一,我们总可以通过一些操作在左移的同时减少它们的个数。
因此我们得到结论,如果 从低到高 的个数总不少于 的个数,并且 则一定可达。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<map>
#include<stack>
#include<string>
#include<random>
#include<bitset>
#include<iomanip>
#define yes puts("yes");
#define inf 0x3f3f3f3f
#define ll long long
#define linf 0x3f3f3f3f3f3f3f3f
#define ull unsigned long long
#define endl '\n'
#define int long long
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
using namespace std;
mt19937 mrand(random_device{}());
int rnd(int x) { return mrand() % x;}
typedef pair<int,int> PII;
const int MAXN =10 + 2e5 ,mod=1e9 + 7;
void solve()
{
int u,v; cin >> u >> v;
bitset<32> bs1(u),bs2(v);
int cnt = 0;
rep(i,0,30) {
cnt += bs1[i] - bs2[i];
if(cnt < 0 || u > v) {
cout << "NO\n";
return;
}
}
cout << "YES\n";
}
signed main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int T;cin>>T;
while(T--)
solve();
return 0;
}
import sys
from math import *
input = sys.stdin.readline
def mrd(): return [int(x) for x in input().split()]
def rd(): return int(input())
MAXN = 2 * 10**5 + 5
INF = 10**16 * 2
mod = 10**9 + 7
#----------------------------------------------------------------------------------#
def solve():
u,v = mrd()
cnt = 0
for i in range(0,30):
cnt += (u >> i & 1) - (v >> i & 1)
if cnt < 0 or u > v:
print("NO")
return
print("YES")
if __name__ == "__main__":
for _ in range(rd()):
solve()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现