题目链接:
HDU 5661 Claris and XOR
题意:
给定区间
[a,b]
和
[c,d]
,求
x∈[a,b]
,
y∈[c,d]
使得
x异或y
的值最大?输出最大的值。
数据范围:
a≤b≤1018,c≤d≤1018
。
分析:
从后往前贪心。假设当前考虑到第
i
位,令
例如对于
x+delt
如果考虑之后的低位的话,最小值是:
Min=x+delt
(低位全为0),最大值为:
Max=x+delt+delt−1
(低位全为1),如果
Min>b或者Max<a
那么就是不合法的,也就是说
x
不能加上
但是我们还要同时考虑
x+delt和y+delt
能否同时实现,尽管不论能否同时实现两者的异或在这一位上都为0,但是如果不考虑的话,就相当于把
x和y
的值缩小了,接下来低位时判断
x+delt
是否属于
[a,b]
和
y+delt
是否属于
[c,d]
会有影响。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
typedef long long ll;
int T;
ll a, b, c, d;
bool check(ll x, ll y, int pos)
{
ll extra = ((ll)1 << pos) - 1;
ll xx = x + extra, yy = y + extra;
if (x > b || xx < a) return false;
if (y > d || yy < c) return false;
return true;
}
int main()
{
scanf("%d", &T);
while (T--) {
scanf("%lld%lld%lld%lld", &a, &b, &c, &d);
ll x = 0, y = 0;
for (int i = 62; i >= 0; --i) {
ll delt = (ll)1 << i;
if (check(x + delt, y, i)) x += delt;
else if (check(x, y + delt, i)) y += delt;
else if (check(x + delt, y + delt, i)) x += delt, y += delt;
}
printf("%lld\n", x ^ y);
}
return 0;
}