6.24 比賽題解

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

題解:

先找左右界二進制從高位向低位數有多少位是相同的,然後把相同位數的數字記爲p
若找到該處數字不一樣,此時的位數爲第o位(二進制下),則ans=p+1<<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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章