1. 程式人生 > >【Hdu 5661】 Claris and XOR 位運算+貪心

【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≤10​18​​),相鄰兩個整數之間有一個空格隔開。

輸出描述

對於每組測試資料,僅一行,一個整數,即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();
          }
}