Claris and XOR Accepts: 27
Submissions: 341
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
Claris非常喜爱位运算,尤其是异或(XOR),因为它具有很多优美的性质。他有四个正整数a,b,c,da,b,c,da,b,c,d,满足a≤ba\leq ba≤b且c≤dc\leq dc≤d。他想选择两个整数x,yx,yx,y,满足a≤x≤ba\leq x\leq ba≤x≤b且c≤y≤dc\leq y\leq dc≤y≤d,使得x XOR yx~XOR~yx XOR y的值最大。但是他不知道该怎么做,所以请你告诉他x XOR yx~XOR~yx XOR y的最大值是多少。
输入描述
有多组测试数据,第一行一个整数T(1≤T≤10,000)T\left(1\leq T\leq10,000\right)T(1≤T≤10,000),表示测试数据的组数。对于每组测试数据:
仅一行,四个整数a,b,c,d(1≤a,b,c,d≤1018)a,b,c,d\left(1\leq a,b,c,d\leq10^{18}\right)a,b,c,d(1≤a,b,c,d≤1018),相邻两个整数之间有一个空格隔开。
输出描述
对于每组测试数据,仅一行,一个整数,即x XOR yx~XOR~yx XOR y的最大值。
输入样例
2
1 2 3 4
5 7 13 15
输出样例
6
11
Hint
在第一组数据中,当且仅当x=2,y=4x=2,y=4x=2,y=4,x XOR yx~XOR~yx XOR y取得最大值。
在第一组数据中,当且仅当x=5,y=14x=5,y=14x=5,y=14或x=6,y=13x=6,y=13x=6,y=13,x XOR yx~XOR~yx XOR y取得最大值。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5661
思路:从高位贪心;(有一个能取1变1),四种情况:
if(tmp+sumx<=b && tmp+sumy>c) sumx += tmp;
else if(tmp+sumy<=d && tmp+sumx>a) sumy += tmp;
else if(tmp+sumx<=b && tmp+sumy<=d)
{
sumx += tmp;
sumy += tmp;
}
*注意位运算long long 时1LL<
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
long long a,b,c,d;
long long tmp;
long long sumx;
long long sumy;
int T;
void solve()
{
sumx=0;
sumy=0;
for(int i=62;i>=0;i--)
{
tmp = 1LL<<i;
if(tmp+sumx<=b && tmp+sumy>c) sumx += tmp;
else if(tmp+sumy<=d && tmp+sumx>a) sumy += tmp;
else if(tmp+sumx<=b && tmp+sumy<=d)
{
sumx += tmp;
sumy += tmp;
}
}
printf("%lld\n",sumx^sumy);
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
solve();
}
}