題解 SP25844【MAXXOR - Find the max XOR value】
阿新 • • 發佈:2022-01-25
SP25844。
,不考慮這一位,去找後面的位也是同理。極端情況是 \(L=R\),此時 \(x=0\),\(2^k-1=0\) 也是沒有問題的。
,顯然這兩個數的異或為 \(2^k-1\)。
以下用 \(\oplus\) 表示異或運算。
先說結論:設 \(x=L\oplus R\),則答案為最小的 \(2^k-1\) 使得 \(2^k-1\ge x\) 即 \(2^k > x\)。
(一)答案不可能超過 \(2^k-1\)。
為了讓異或後最高位儘量高,我們先取一個最高位最高的數,也就是 \(R\),然後再取一個數使得該位儘量為 \(0\)。
如果 \(L\) 的該位為 \(0\),符合條件,此時答案最高位與 \(x\) 都相同,而 \(2^k-1\) 是最高位相同的最大的數,所以答案一定不超過 \(2^k-1\)。如果 \(L\) 的該位為 \(1\),則該位異或出來為 \(0\)
(二)答案可以取到 \(2^k-1\)。
我們稱在二進位制下表示 \(0\) 或 \(2^i\) 的數位為“第 \(i\) 位”。
因為 \(x=L\oplus R\) 在第 \(k-1\) 位為 \(1\),說明 \(L\sim R\) 之間有一個位置的第 \(k-1\) 位發生了變化。而 \(L\sim R\) 是連續變化的,每次加一,也就是說必然有一個位置從 \(\underbrace{11\cdots 1}_{k-1\ \text{個}}\) 變成了 \(1\underbrace{00\cdots 0}_{k-1\ \text{個}}\)
綜上,結論正確。
//By: Luogu@rui_er(122461) #include <bits/stdc++.h> #define rep(x,y,z) for(int x=y;x<=z;x++) #define per(x,y,z) for(int x=y;x>=z;x--) #define debug printf("Running %s on line %d...\n",__FUNCTION__,__LINE__) #define fileIO(s) do{freopen(s".in","r",stdin);freopen(s".out","w",stdout);}while(false) using namespace std; typedef long long ll; template<typename T> void chkmin(T& x, T y) {if(x > y) x = y;} template<typename T> void chkmax(T& x, T y) {if(x < y) x = y;} int main() { int L, R; scanf("%d%d", &L, &R); R ^= L; for(int i=0;;i++) { if((1 << i) > R) { printf("%d\n", (1 << i) - 1); break; } } return 0; }
順帶一提,因為資料水,第 \(18\) 行的大於號打成大於等於也可以通過,但顯然不對,例如 \(L=2,R=3\)。
本文來自部落格園,作者:rui_er,轉載請與作者聯絡並註明原文連結:https://www.cnblogs.com/ruierqwq/p/sp-25844.html