Claris and XOR
题解:考虑异或的性质,肯定是尽量让 x x x和 y y y满足以下两种情况:
- x x x第 i i i位为 1 1 1, y y y第 i i i位为 0 0 0
- x x x第 i i i位为 0 0 0, y y y第 i i i位为 1 1 1
但是要考虑第三种种情况,以上两种情况都满足不了时,第 i i i位同时为 1 1 1,此时我们应该也算上,不然对于判断后面低位的时候会有影响。
因此我们直接考虑枚举二进制位即可。至于判断的时候,我们去看在 x + ( 1 < < i ) x+(1<<i) x+(1<<i)的时候去看它的上界 x + ( 1 < < i ) + ( 1 < < i ) − 1 x + (1<<i) + (1<<i) - 1 x+(1<<i)+(1<<i)−1,此时低位全为 1 1 1,和它的下界 x + ( 1 < < i ) x + (1<<i) x+(1<<i),此时低位全为 0 0 0,只要上下界不超过 [ a , b ] [a,b] [a,b]即可。对于 y y y的判断亦是如此。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL a,b,c,d;
bool ok(LL x,LL y,int i)
{
LL t = (1LL << i) - 1;
LL x1 = x + t, y1 = y + t;
if(x > b || x1 < a || y > d || y1 < c) return 0;
return 1;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.in","r",stdin);
#endif
int T;
cin>>T;
while(T--){
cin>>a>>b>>c>>d;
LL x = 0, y = 0;
for(int i = 62; i >= 0; --i){
LL t = (1LL << i);
if(ok(x + t, y, i)){
x += t;
}else if(ok(x, y + t, i)){
y += t;
}else if(ok(x + t, y + t, i)){
x += t;
y += t;
}
}
cout<<(x ^ y)<<endl;
}
return 0;
}