zoukankan      html  css  js  c++  java
  • CodeForces 485C Bits[贪心 二进制]

    C. Bits

    time limit per test1 second

    memory limit per test256 megabytes

    inputstandard input

    outputstandard output

    Let's denote as  the number of bits set ('1' bits) in the binary representation of the non-negative integer x.

    You are given multiple queries consisting of pairs of integers l and r. For each query, find the x, such that l ≤ x ≤ r, and  is maximum possible. If there are multiple such numbers find the smallest of them.

    Input

    The first line contains integer n — the number of queries (1 ≤ n ≤ 10000).

    Each of the following n lines contain two integers li, ri — the arguments for the corresponding query (0 ≤ li ≤ ri ≤ 1018).

    Output

    For each query print the answer in a separate line.

    Examples

    input

    3

    1 2

    2 4

    1 10

    output

    1

    3

    7

    Note

    The binary representations of numbers from 1 to 10 are listed below:

    110 = 12

    210 = 102

    310 = 112

    410 = 1002

    510 = 1012

    610 = 1102

    710 = 1112

    810 = 10002

    910 = 10012

    1010 = 10102


     

    题意:求l和r之间二进制1的个数最多的数字x


     

    首先证明x一定在l的基础上

    然后从低位贪心把0变成1

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    #include <queue>
    using namespace std;
    typedef long long ll;
    inline ll read(){
        char c=getchar();ll x=0,f=1;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    ll T,l,r;
    int main(int argc, const char * argv[]) {
        T=read();
        while(T--){
            l=read();r=read();
            ll t=1;
            while(l<r){
                if((l|t)>r) break;
                l|=t;
                t<<=1;
            }
            printf("%I64d
    ",l);
        }
        return 0;
    }
  • 相关阅读:
    LeetCode#18-四数之和
    LeetCode#209-长度最小的子数组
    LeetCode#234-回文链表
    LeetCode#287-寻找重复数
    LeetCode#167-两数之和
    LeetCode#141-环形链表
    LeetCode#826-安排工作达到最大收益
    LeetCode#86-分隔链表
    LeetCode#19-删除链表的倒数第N个节点
    LeetCode#88-合并两个有序数组
  • 原文地址:https://www.cnblogs.com/candy99/p/5986376.html
Copyright © 2011-2022 走看看