现在的位置: 首页 > 综合 > 正文

CF – 484 – A. Bits(构造)

2019年08月29日 ⁄ 综合 ⁄ 共 576字 ⁄ 字号 评论关闭

题意:n(1 ≤ n ≤ 10000) 组数据,每组一个l, r(0 ≤ li ≤ ri ≤ 10^18),求[l, r]间二进制表示1最多的,最小的数。

题目链接:http://codeforces.com/problemset/problem/484/A

——>>如果 l 与 r 的二进制位数不一样,那么此时应达全1状态近 r。。

如果 l 与 r 的进制数位数一样的时候,从较小数不断加各个位置的 1 ,不超过 r 得到的数就是结果。。

1LL.。。。。。。。

#include <cstdio>

int Cal(long long x)
{
    int ret = 0;

    while (x)
    {
        ++ret;
        x >>= 1;
    }

    return ret;
}

int main()
{
    int n;
    long long l, r, ret;

    scanf("%d", &n);
    while (n--)
    {
        scanf("%I64d%I64d", &l, &r);

        int lcnt = Cal(l);
        int rcnt = Cal(r);

        if (lcnt < rcnt)
        {
            if (r == (1LL << rcnt) - 1)
            {
                ret = r;
            }
            else
            {
                ret = (1LL << (rcnt - 1)) - 1;
            }
        }
        else
        {
            for (int i = 0; i < rcnt; ++i)
            {
                if (((1LL << i) | l) <= r)
                {
                    l |= (1LL << i);
                }
            }
            ret = l;
        }

        printf("%I64d\n", ret);
    }

    return 0;
}

抱歉!评论已关闭.