nkoj 2060
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」
分析:
1 => 00001
2 => 00010
3 => 00011
4 => 00100
5 => 00101
6 => 00110
7 => 00111
8 => 01000
9 => 01001
10 => 01010
11 => 01011
12 => 01100
13 => 01101
14 => 01110
15 => 01111
16 => 10000
17 => 10001
18 => 10010
solve(l,r)表示區間[l,r]的最大異或。
由0~18可以歸納出,當l,r的二進位制位數不同的時候,所求的就是 2^p-1 (其中p是r的二進位制位數)
當l,r的二進位制位數相同,根據異或運算的法則,最高位的計算結果一定是0,可以直接抹去。
**如下:
#include#include#define ll long long
using namespace std;
ll bitcnt(ll x)
ll solve(ll l,ll r)
for(i=62;i>=0;i--)
if(temp<=a)
} }
最大異或和
問題描述 給出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...