1. 程式人生 > 其它 >題解 SP25844【MAXXOR - Find the max XOR value】

題解 SP25844【MAXXOR - Find the max XOR value】

SP25844。

以下用 \(\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\)

,不考慮這一位,去找後面的位也是同理。極端情況是 \(L=R\),此時 \(x=0\)\(2^k-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{個}}\)

,顯然這兩個數的異或為 \(2^k-1\)

綜上,結論正確。

//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