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 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.

Sample test(s)

input

31 22 41 10

output

137

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

 题意:给n个询问,每次询问你l,r之间的数,在二进制下1位数最多的是哪个数

题解:我们从l向上构造,在0位补齐,贪心从小位到大位的补齐,一定是最优

///1085422276

#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std ;
typedef long long ll;
typedef unsigned long long ull;
#define mem(a) memset(a,0,sizeof(a))
#define pb push_back
inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){
        if(ch==‘-‘)f=-1;ch=getchar();
    }
    while(ch>=‘0‘&&ch<=‘9‘){
        x=x*10+ch-‘0‘;ch=getchar();
    }return x*f;
}
//****************************************
const int  N=6000+50;
#define mod 10000007
#define inf 1000000001
#define maxn 10000

int d[5000];
ll test(ll x,ll y) {
     for(int i=0;i<63;i++) {
        if(!(x&(1ll<<i))&&x+(1ll<<i)<=y)
          x+=(1ll<<i);
     }
    return x;
}
int main() {
    int n=read();ll l,r;
    for(int i=1;i<=n;i++) {
       cin>>l>>r;
        cout<<test(l,r)<<endl;
    }
    return 0;
}

代码

时间: 2024-10-12 18:11:29

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

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 #459 (Div. 2) C 思维,贪心 D 记忆化dp

Codeforces Round #459 (Div. 2) C. The Monster 题意:定义正确的括号串,是能够全部匹配的左右括号串. 给出一个字符串,有 (.). ? 三种字符, ? 可以当作 ( 可 ) . 问这个字符串有多少个子串是正确的括号串. tags:好考思维,想不到.. 预处理出每个字符向左向右最多可以匹配到哪里,再 O(n*n) 枚举所有区间,看是否符合条件. // C #include<bits/stdc++.h> using namespace std; #pra

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

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. 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 m

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 #613 (Div. 2)D(贪心,分治)

构造两颗深度为30的字典树(根节点分别是0和1),结点只有0和1,从根节点向下DFS,贪心取答案. 1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 vector<int>a; 5 int dfs(vector<int>b,int x){ 6 if(x<0||b.size()==0)//30位都枚举完毕或当前向量中没有数字就中止 7 return 0;

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 #508 (Div. 2) T3 (贪心)

贪心的选取最优解 然后相减好 记得要开long long #include <cstdio> #include <algorithm> #include <cstring> #include <set> #include <queue> #define int long long using namespace std; int ansa=0,ansb=0,posa=1,posb=1,n,a[1000100],b[1000100]; bool c