这道题直接去构造答案即可。
对于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 int const 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 ",l); break; } else { l|=p; p*=2; } } } //fclose(stdin); //fclose(stdout); return 0; }