【Hdu 5661】 Claris and XOR 位運算+貪心
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取得最大值。
思路:從高位貪心;(有一個能取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();
}
}