每日一题 兔子的区间密码 (思维/位运算)

兔子的区间密码

https://ac.nowcoder.com/acm/problem/20860

一.题意

给你一个区间
求两个数异或最大

二.题解

由于数据很大,所以不能暴力找
而题目说到异或最大,其实就是让我们往位运算方面/二进制方面去想
让这个数最大,就是尽量让高位为 1
比如[111101,110011]这种情况
可以发现最高两位的 1 两者都会异或抵消,所以最大的贡献位在第三位
从第三位开始可以找到1101和0010凑成1111就是使得答案最大
所以其实就是找最高的贡献位
其余的低位部分都在范围里可以操控使得全1
所以答案就是 最高位*2-1

三.代码:

#include<bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define ll long long
#define fi first
#define se second
#define inf 0x3f3f3f3f
#define eps 1e-10
#define io std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}

const int manx=1e3+5;
const int N=5e2+5;
const int mod=1e9+7;

int main(){
    io; ll n; cin>>n;
    while(n--){
        ll l,r; cin>>l>>r; 
        if(l==r){ cout<<0<<endl; continue;}
        ll x=1ll<<62;
        while((l&x)==(r&x)) x>>=1;
        x<<=1;
        cout<<x-1<<endl;
    }
}
全部评论

相关推荐

2 收藏 评论
分享
牛客网
牛客企业服务