120561I

https://ac.nowcoder.com/acm/contest/120561/I

(同样诡异的🔑)

主要是找规律。

的二进制最高位,令,则

1.若,则显然答案为

2.若,则答案为,因为区间中含有的所有数,通过和做与操作能得到间的所有数字。

3.若,那么同2,一定可以得到的所有数。同时可以构造到比更小的下界(这个下界等于二进制下开始的第一段连续构成的数),只要能拼接上即为,否则为

代码:

#include<bits/stdc++.h>
using namespace std;
int read(){
	char ch=getchar();int x=0,f=1;
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
int highbit(int x){
	for(int i=31;i>=0;i--){
		if(x&(1<<i)){
			return i;
		}
	} 
	return -1; 
}
void work(){
	int l=read(),r=read();
	if(l==0){
		printf("%d\n",r+1);
		return;
	}
	int a=highbit(l),b=highbit(r);
	if(a+1<b){
		printf("%d\n",r+1);
		return;
	}
	if(a==b){
		puts("0");
		return;
	}
	int res=0;
	for(int i=31;i>=0;i--){
		if(l&(1<<i)){
			while(l&(1<<i)){
				res+=(1<<i);
				i--;
			}
			break;
		}
	}
	int ma=r-(1<<b);
	if(ma+1>=res){
		printf("%d\n",r+1);
		return;
	}
	printf("%d\n",ma+1);
}
int main(){
	int t=read();
	while(t--){
		work();
	}
	return 0;
} 
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务