NKOI 3671最大異或

2021-07-11 14:36:32 字數 1852 閱讀 3869

最大異或

time limit:10000ms  memory limit:65536k

total submit:59 accepted:32 

case time limit:1000ms

description

乙個小女孩非常喜歡關於二進位制位的問題,下面是其中乙個問題: 

給你兩個整數l和r,找出a xor b結果值最大的一對,(l ≤ a ≤ b ≤ r) 

xor表示異或,在c++裡的運算子是"^"

input

兩個空格間隔的整數l和r (1<=l<=r<=1018)

output

乙個整數,表示最大的異或的結果

sample input

樣例輸入1:

1 2樣例輸入2:

8 16

樣例輸入3:

1 1

sample output

樣例輸出1:

3樣例輸出2:

31樣例輸出3:

0

hint

注意:一般情況下我們只在32位數字範圍內進行位運算 

如果要在64位也就是long long範圍內做位運算,參與運算的必須是long long型別,比如把1左移60位,我們應寫成「1ll<<60」 

觀察以下數

00000

00001

00010

00011

00100

00101

00110

00111

01000

01001

01010

01011

01100

01101

01110

01111

10000

10001

10010

求[0,18]區間的最大異或:

顯然是16^15=(10000)2^(01111)2=(11111)2=31

求[0,15]區間的最大異或:

顯然是8^7=(01000)2^(00111)2=(01111)2=15

求[0,7]區間的最大異或:

顯然是4^3=(00100)2^(00011)2=(00111)2=7

規律:我們要求區間[l,r]的最大異或,只需在區間[l+1,r]中找出值最大的乙個二進位制形式形如「0...0100...0」的數,即2的次方

設此數為x,那麼答案就是x^(x-1)

若範圍內無這種2的次方數,例如:

01001

01010

01011

01100

01101

01110

01111

我們發現整個區間的所有數字都最高位的1都相同,我們把它們全部抹掉。變成下面的樣子:

00001

00010

00011

00100

00101

00110

00111

我們可以應用上面的規律:

其中最大的異或值為000100^000011

#include#include#define er long long

using namespace std;

er s(er x)

er solve(er l,er r){

er a=s(l),b=s(r);

if(a!=b) return (1ll<>a>>b;

cout<

最大異或和

問題描述 給出n個整數,多組詢問求乙個給出的數與這n個數中的乙個數的最大異或的值。輸入格式 第一行乙個整數n,表示有個數字。第二行n個正整數。第三行乙個整數m,表示m個詢問。第四行m個整數,表示m個詢問的整數。輸出格式 共m行,對於每個詢問輸出最大的異或值。輸入樣例 43 5 6 7 31 4 7 ...

最大異或對

acwing 143.最大異或對 在給定的n個整數a1,a2 an中選出兩個進行xor 異或 運算,得到的結果最大是多少?輸入格式第一行輸入乙個整數n。第二行輸入n個整數a1 an。輸出格式輸出乙個整數表示答案。資料範圍1 n 105,0 ai 231 輸入樣例 3 1 2 3 輸出樣例 題解 異或...

最大異或對

最大異或對 題解 這題採用的是01字典樹,一般這種異或問題都採用的是01字典樹樹解決。includeusing namespace std const int n 2e6 1 typedef long long ll ll a n int cnt 1 int tree 3 n 2 void inse...