首页 > 代码库 > Codeforces Round #276 (Div. 2)C. 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<map>#include<set>#include<vector>#include<algorithm>#include<stack>#include<queue>#include<cctype>#include<sstream>using namespace std;#define pii pair<int,int>#define LL long long intconst int eps=1e-8;const int INF=1000000000;const int maxn=10000+5;int n;LL l,r,p;int main(){    //freopen("in9.txt","r",stdin);    //freopen("out.txt","w",stdout);    scanf("%d",&n);    while(n--)    {        scanf("%I64d%I64d",&l,&r);        p=1;        while(1)        {            if((l|p)>r)            {                printf("%I64d\n",l);                break;            }            else            {                l|=p;                p*=2;            }        }    }    //fclose(stdin);    //fclose(stdout);    return 0;}

 

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