zoukankan      html  css  js  c++  java
  • CodeForces 484A Bits

    意甲冠军:

    10000询价  每次查询输入L和R(10^18)  在区间的二进制输出指示1大多数数字  1个数同样输出最小的

    思路:

    YY一下  认为后几位全是1的时候能保证1的个数多  那么怎样构造出这个数字呢??

    将L和R都变成二进制  从高位到低位  L和R同样的那几位一定是不变的  由于要保证构造出的数字在区间内  然后分两种情况

    一是L和R一直同样  那就没什么好说的了  就是它了

    二是发现了有一位不同  这时R的那个位一定是1  L的一定是0  那么仅仅要把R的那个1变成0  然后把后面的全部位都变成1就构造出了数字  这时一定1最多吗??  不一定  比方  R=101111 L=100000  构造出来是100111  这时要特判一下  假设把差异的那一位变回1是不是超过R  不超过的话  变回来更优

    代码:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<map>
    #include<set>
    #include<vector>
    #include<queue>
    #include<cstdlib>
    #include<ctime>
    #include<cmath>
    using namespace std;
    typedef long long LL;
    
    int main() {
        int n;
        LL l, r, ans;
        scanf("%d", &n);
        while (n--) {
            cin >> l >> r;
            ans = 0;
            for (int i = 61; i >= 0; i--) {
                if ((r & (1LL << i)) && !(l & (1LL << i))) {
                    ans |= (1LL << i);
                    ans--;
                    if (ans + (1LL << i) <= r)
                        ans += (1LL << i);
                    break;
                } else {
                    if (r & (1LL << i))
                        ans |= (1LL << i);
                }
            }
            cout << ans << endl;
        }
        return 0;
    }


    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    Linux利器strace
    记一次MongoDB性能问题
    mongodb慢查询记录
    PHP操作MongoDB学习笔记
    字典NSDictionary的常见用法
    字典与自定义对象的相互转换
    URLString中文字符转义
    常见序列化与反序列化方法
    Swift处理异常的三种方式-try
    客户端Socket使用步骤
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4837688.html
Copyright © 2011-2022 走看看