题目链接:
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;
}