最大或

应该想到用二进制表示 l,r

紧接着敢于尝试,贪心,对拍!!!

#include 
#include 
#include 
#include 
#include 
#define LL long long

using namespace std;

inline int wread(){
	char c(getchar ());int wans(0),flag(1);
	while (c<'0' || c>'9'){if (c=='-') flag=-1;c=getchar ();}
	while (c>='0' && c<='9'){wans=wans*10+c-'0';c=getchar ();}
	return wans*=flag;
}

inline LL ll_wread(){
	char c(getchar ());LL wans(0),flag(1);
	while (c<'0' || c>'9'){if (c=='-') flag=-1;c=getchar ();}
	while (c>='0' && c<='9'){wans=wans*10+c-'0';c=getchar ();}
	return wans*=flag;
}

int T; 
int a[70],b[70],pr[70];

LL S[80]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648,4294967296,8589934592,17179869184,34359738368,68719476736,137438953472,274877906944,549755813888,1099511627776,2199023255552,4398046511104,8796093022208,17592186044416,35184372088832,70368744177664,140737488355328,281474976710656,562949953421312,1125899906842624,2251799813685248,4503599627370496,9007199254740992,18014398509481984,36028797018963968,72057594037927936,144115188075855872,288230376151711744,576460752303423488,1152921504606846976};

int main (){
	T=wread();
	while (T--){
		LL l(ll_wread()),r(ll_wread());
		LL nx(r),ans (0);
		int wei1(0),wei2(0);
		while (nx){
			wei1++;
			a[wei1] = nx & 1;
			nx>>=1;
		}
		nx = l;
		while (nx){
			wei2++;
			b[wei2] = nx & 1;
			nx>>=1;
		} 
		if (wei1==wei2){
			int sav(0);
			for (int i(wei1);i>=1;--i)
				if (a[i] && ( !b[i] )) {sav=i;break;}
			for (int i(wei1);i>sav;--i){
				if (a[i])	ans += //pow(2,i-1);
									S[i-1];
			}
			for (int i(sav);i>=1;--i){
				ans += //pow (2,i-1);
						S[i-1];
			}
		}
		else {
			for (int i(0);i

 

你可能感兴趣的:(NOIP模拟,NOIP模拟)