题意:给出区间[ll,rr],求中间一个数二进制表示时一的个数最多。
写出ll和rr的二进制,设出现第一个不同的位置为pos(从高位到低位),找的数为x,那么为了使x在[ll,rr]内,前pos-1个位必须也相同。而rr在pos和pos后如果都为1,那么pos和pos后都取1,否则pos取0,pos后取1。
乱码:
//#pragma comment(linker,"/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<vector> #include<cmath> #include<queue> #include<stack> #include<map> #include<set> #include<algorithm> #include <stack> #include <list> using namespace std; const int SZ=1000010,INF=0x7FFFFFFF; typedef long long lon; const double EPS=1e-9; const lon one=1; lon geth(lon x) { lon res=0; for(lon i=0;i<64;++i) { if(x&(one<<i)) { res=max(res,i); } } return res; } int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); lon n; cin>>n; for(int i=0;i<n;++i) { lon ll,rr; cin>>ll>>rr; lon bit=geth(rr); lon res=0; for(lon j=bit;j>=0;--j) { lon b1=rr&(one<<j); lon b2=ll&(one<<j); if(b1^b2) { lon cand=0; for(lon k=j;k>=0;--k) { if(rr&(one<<k))++cand; } res+=(one<<max(j,cand))-1; break; } else res+=((one<<j)&rr); } cout<<res<<endl; } return 0; }