HDU5661---Claris and XOR

问题描述
Claris非常喜爱位运算,尤其是异或(XOR),因为它具有很多优美的性质。他有四个正整数a,b,c,da,b,c,d,满足a\leq babc\leq dcd。他想选择两个整数x,yx,y,满足a\leq x\leq baxbc\leq y\leq dcyd,使得x~XOR~yx XOR y的值最大。但是他不知道该怎么做,所以请你告诉他x~XOR~yx XOR y的最大值是多少。
输入描述
有多组测试数据,第一行一个整数T\left(1\leq T\leq10,000\right)T(1T10,000),表示测试数据的组数。对于每组测试数据:
仅一行,四个整数a,b,c,d\left(1\leq a,b,c,d\leq10^{18}\right)a,b,c,d(1a,b,c,d1018),相邻两个整数之间有一个空格隔开。
输出描述
对于每组测试数据,仅一行,一个整数,即x~XOR~yx XOR y的最大值。
输入样例
2
1 2 3 4
5 7 13 15
输出样例
6
11
Hint
在第一组数据中,当且仅当x=2,y=4x=2,y=4x~XOR~yx XOR y取得最大值。
在第一组数据中,当且仅当x=5,y=14x=5,y=14x=6,y=13x=6,y=13x~XOR~yx XOR y取得最大值。 
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
	int Cas;
	cin>>Cas;
	long long a,b,c,d;
	long long sumx,sumy;
	long long temp;
	while(Cas--){
		sumx = 0;//a <= sumx <= b 
		sumy = 0;//c <= sumy <=d
        //并没有规定 b < c或 a < d 
		scanf("%I64d%I64d%I64d%I64d",&a,&b,&c,&d);
		for(int i = 62; i >= 0; i--){
			temp = 1;
			temp = temp << i;//使得temp都是10000000……(二进制)的形式来比较最高位 
			if(temp + sumy <=d &&temp +sumx <= b ){
				if(temp + sumx < a && temp + sumy < c){//如果temp+sum<最小范围,那么该位必须为1 
					sumx = sumx + temp;
					sumy = sumy + temp;
				}
				else if(temp + sumx < a) sumx = sumx + temp;
				else if(temp + sumy < c) sumy = sumy + temp;
				else sumx = sumx + temp;//当temp + sum 在取值范围之内,那么只需一位为1,
				                       //另一位为0即可 ,方可使得异或最大 
			}
			else if(temp + sumy <= d) 	sumy = sumy + temp;
			else if(temp + sumx <= b)   sumx = sumx + temp;
			//最后一句是因为b有可能是最大的数时,最先判断就是它 
		}
		long long ans = sumx^sumy;
		printf("%I64d\n",ans);
	}
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值