牛客竞赛 1031 Bits

题意

给定l到r区间 , 求区间内\('1'\)最多的数字 , 多组询问

思路

从高位到低位想 :
如果相同 , 那么只能取那个相同的数

如果不同 , 那么第一次不同必然是r为1, l为0

此时两种选择 , 选1或者0

如果选\(0\) , 那么之后必然都可以选择\(1\)

如果选\(1\) , 那么除非后面全是\(1\) , 否则不会优于选\(0\)

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long int
inline int read() {
    int ans = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-')f = -1;
        ch = getchar();
    }
    while (ch <= '9' && ch >= '0') {
        ans = ans * 10 + ch - '0';
        ch = getchar();
    }
    return ans * f;
}
int all_one(int x,int pos) {
    for (int i = pos ;i>=0 ;i--) {
        if (x & 1ll<<i)
            continue;
        return false;
    }
    return true;
}
//01111
//11110
void solve() {
    int ans = 0;
    int l=read(),r=read();
    if (l==r) {
        cout<<l<<"\n";
        return ;
    }
    for (int i = 63;i>=0; i--) {
        if ((l & 1ll<<i) ==( r&1ll<<i)) {
            ans =(ans << 1) + (l>>i & 1);
        }
        else {
            if (all_one(r,i-1)) {
                ans <<= (i+1);
                ans += (1ll<<(i+1))-1;
            }
            else {
                ans <<=(i+1);
                ans += (1ll<<i)-1;
            }
            cout<<ans<<"\n";
            return ;
        }
    }
}
//11110
//
signed main() {
    int t=read();
    while (t--) solve();
    return 0;
}
posted @ 2025-06-21 00:33  Guaninf  阅读(107)  评论(0)    收藏  举报