T1.二進制
問題描述
何老闆給你一段區間[L,R],他問你,該區間中,哪一個數字對應的二進制中,“1”的數量最多,請你找出這個數字。
輸入格式
第一行,一個整數t,表示何老闆一共詢問了t次
接下來t行,每行兩個整數L,R,表示一次詢問區間
輸出格式
t行,每行一個整數,依次表示每個詢問的答案,如果有多解,輸出最小的一個。
數據範圍
對於40%的數據:1<=t<=100,0<=L<=R<=105
對於100%的數據:1<=t<=10000,0<=L<=R<=1018
題解:
先找左右界二進制從高位向低位數有多少位是相同的,然後把相同位數的數字記爲 。
若找到該處數字不一樣,此時的位數爲第o位(二進制下),則
代碼:
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<algorithm>
#include<cmath>
#include<cstring>
#define LL long long
using namespace std;
int main(){
LL i,j,l,r,t,p,ans;
freopen("wei.in","r",stdin);
freopen("wei.out","w",stdout);
scanf("%lld",&t);
while(t--){
scanf("%lld%lld",&l,&r);
if(l==r){
printf("%lld\n",l);
continue;
}
ans=0;
for(j=63;j>=1;j--){
p=(1LL<<(j-1));
if((p&l)!=(p&r))break;
ans+=p&l;//找相同位數
}
p=(1LL<<j)-1;
if(p!=(p&r)&&p!=1)
p=(1LL<<(j-1))-1;//若此時該出後面全是1或者此時位數爲1則改變一下p
printf("%lld\n",p+ans);
}
return 0;
}