2019陕西省赛(J - Coolbits)

ZOJ (pintia.cn)

2019陕西省赛(J - Coolbits)_第1张图片

2019陕西省赛(J - Coolbits)_第2张图片

题意:给你n个区间l,r,然后从这每个区间里面选取一个数,让他们的bitwise and的值最大,求出这个值。

思路:因为数据范围是1e9,所以每次check一下(1<

时间复杂度:其实也就是n*30,不会超时

#include
using namespace std;
const int N=1e6+10;
int l[N],r[N];
int cck,n;
#define int long long
bool check(int x){
	cck+=x;
	for(int i=1;i<=n;i++){
		int tm=l[i];
		int tmm=r[i];
		if((tm|x)!=tm){
			tm+=x;
			tm&=cck;
		}
		if((tmm|x)!=tmm){
			tmm-=x;
			tmm|=(x-1);
		}
		if(tm>tmm) return 0;
	}
	return 1;
}
void sbcheck(int x){
	for(int i=1;i<=n;i++){
		if((l[i]|x)!=l[i]){
			l[i]+=x;
			l[i]&=cck;
		} 
		if((r[i]|x)!=r[i]){
			r[i]-=x;
			r[i]|=(x-1);
		}
	}
}
signed main(){
	int t;
	cin>>t;
	while(t--){
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>l[i]>>r[i];
		}
		int res=0;
		for(int i=30;i>=0;i--){
			if(check(1<

 

 

你可能感兴趣的:(数论,思维题,算法,c++,数据结构)