Title

区间或

区间或

给定l,r, 求ll+1r1r

思路一

l,r从最高位到最低位中第一个不同的位第i位,li肯定是0, ri肯定是1, (因为r<l), 比第i位高的,所有数都一样,比第i位低的肯定位或后的结果是1,所以第i位之前和a一样, 第i位及其之后都是1就好了

代码

void solve()
{
    int l = 0, r = 0;
    std::cin >> l >> r;
    while(l < r) l |= (l + 1);
    std::cout << l << endl;
}

思路二

考虑优化,我们怎么知道第i位是哪一位呢? 可以用异或,lr的最高位肯定是上面提到的第i位,用log2()函数能知道这是第几位

假设我们求出来了第i位是第t位,我们可以构造一个数2t+11,让这个数去和l位或就好了

代码

int get_or(int l, int r)
{
    int t = std::__lg(l ^ r);
    return ((1 << (t + 1)) - 1) | l;
}

例题 CF1981B. Turtle and an Infinite Sequence

代码

#include <bits/stdc++.h>
#define endl '\n'
#define int long long

int get_or(int l, int r)
{
    int t = std::__lg(l ^ r);
    return ((1 << (t + 1)) - 1) | l;
}

void solve()
{
    int n = 0, m = 0, l = 0, r = 0;
    std::cin >> n >> m;
    l = std::max(0ll, n - m) , r = n + m;
    std::cout << get_or(l, r) << endl;
}

signed main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr); std::cout.tie(nullptr);
    //freopen("out.txt", "w", stdout);
    int t = 1;
    std::cin >> t;
    while(t--)
    {
        solve();
    }
    return 0;
}
posted @   栗悟饭与龟功気波  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示