Codeforces Round #276 (Div. 1)Bits

题意就是给你一个区间[l,r],求这个区间中化成二进制形式1最多的数,如果有多解输出最小值.

贪心即可,把l化为二进制,把最右边不是0的变成1.

例如 19 30

10011 11110

第一步 10011-->10111

第二步 10111-->11111大于30退出循环 答案即是10111

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int main(){
    int t;
    for(scanf("%d",&t);t;t--){
        unsigned long long lef,rig;
        cin>>lef>>rig;
        for (int i=0;i<64;i++){
            if (((1LL<<i)&lef)==0){
                if (((1LL<<i)|lef)<=rig){
                    lef |= (1LL<<i);
                }else{
                    break;
                }
            }
        }
        cout<<lef<<endl;
    }
    return 0;
}
时间: 2024-10-24 06:26:54

Codeforces Round #276 (Div. 1)Bits的相关文章

Codeforces Round #276 (Div. 1) A. Bits 贪心

A. Bits 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 max

C. Bits (Codeforces Round #276 (Div. 2) )

题目大意:给你两个数l,r(l<r),求一个数是大于等于l且小于等于r的数中二进制数的1的个数最多,如果1的个数相同则取最小的那个(翻译渣,请见谅!) 思路:把左区间L化为二进制,再把左区间的二进制的从最小位开始,每位变为1,因为这是在当前1的个数中最小的且大于L的.条件是小于等于右区间R. 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <stdio

Codeforces Round #276 (Div. 2)C. Bits(构造法)

这道题直接去构造答案即可. 对于l的二进制表示,从右到左一位一位的使其变为1,当不能再变了(再变l就大于r了)时,答案就是l. 这种方法既可以保证答案大于等于l且小于等于r,也可以保证二进制表示时的1最多. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include&l

Codeforces Round #276 (Div. 1)

Codeforces 484 A. Bits 做题感悟:这题不难,是一个构造题,找一下规律就好. 解题思路: 假如两个数的二进制位数分别是 a ,b.(这里假设 a < b)  , 当 b - a >= 1 时只有两种情况可以选择 (1 << b) - 1  or  (1<<a) -1  ,这里当然先判断前一个是否满足,当 a = b 的时候,枚举两个数的每一位,如果出现小的数当前位为 0 ,且大的数当前位为 1 ,那么也有两种情况选择要么当前位加上后面的所有位都为 1

Codeforces Round #276 (Div. 1)D.Kindergarten DP贪心

D. Kindergarten In a kindergarten, the children are being divided into groups. The teacher put the children in a line and associated each child with his or her integer charisma value. Each child should go to exactly one group. Each group should be a

Codeforces Round #276 (Div. 2)

A. Factory 题意:给出a,m,第一天的总量为a,需要生产为a%m,第二天的总量为a+a%m,需要生产(a+a%m)%m 计算到哪一天a%m==0为止 自己做的时候,把i开到1000来循环就过了,后来搜题解发现这样过了是运气好 应该这样理解:a大于m的时候没有意义,当a%m重复出现的时候,说明出现了循环,终止计算. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<

Codeforces Round #276 (Div. 2)D - Maximum Value(筛法)

就是一种筛法思想的应用. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<map> #include<set> #include<vector> #include<algorithm> #include<

Codeforces Round #276 (Div.1) Solution

水平越来越菜了 A  水题,注意后面全是1的情况 B  调和级数呀.把倍数全部扫一遍.一个数是多个数的倍数的话肯定是大的比较优.然后可以用two pointer扫一下. C  就是一个置换群,把轮换找出来就好了.傻逼的写了好久. D  有意思的傻逼DP,容易得到dp[i] = max{dp[j] + max{abs(a[k]-a[h])}} .只要更新一个U = max{a[i] + max_{0~(i-1)}{dp[i]}}和D = max{-a[i] + max_{0~(i-1)}{dp[i

Codeforces Round #276 (Div. 2)A. Factory(数论)

这道题可以暴力的一直按要求的方法去做,做1000000次还不能整除m就认为永远不能整除m了(m不超过100000,循环1000000次比较安全了已经).这种方法可以AC. 下面深入的分析一下到底循环多少次就可以确定结果:首先有这样一个规律:(a+b)%c=(a%c+b%c)%c,那么这样其实这道题每次就是2*a.官方题解说的好: Production will stops iff exists integer K ≥ 0 such a·2K is divisible by m. From thi