CF276D Little Girl and Maximum XOR
阿新 • • 發佈:2022-03-27
題目大意
在區間 \([l,r]\) 中找出兩個數 \(a,b(a\le b)\),使得 \(a\oplus b\) 達到最大。
題目分析
這是一道貪心題。
一下簡稱十進位制數 \(k\) 在二進位制下表示為 \(k_2\)。
我們先找到 \(r_2\) 第一個與 \(l_2\) 不同的位置(即 \(r_2\) 的某一位為 \(1\),\(l_2\) 的這一位為 \(0\))。設答案的 \(a_2\) 這一位為 \(1\),剩下的都是 \(0\)。這樣可以保證 \(a\) 一定大於等於 \(l\),小於等於 \(r\)。另一個 \(b\) 呢,設這一位為 \(0\),剩下的都是 \(1\)
設第一個滿足條件的位數是 \(k\),那麼最後的答案就是 \(2^{k+1}-1\)。
也就是 \(1111\dots1111\),共有 \(k\) 個 \(1\)。
程式碼
//2022/3/8 //2022/3/26 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdio> #include <climits>//need "INT_MAX","INT_MIN" #include <cstring>//need "memset" #include <numeric> #include <algorithm> #define int long long #define enter() putchar(10) #define debug(c,que) cerr << #c << " = " << c << que #define cek(c) puts(c) #define blow(arr,st,ed,w) for(register int i = (st);i <= (ed); ++ i) cout << arr[i] << w; #define speed_up() cin.tie(0),cout.tie(0) #define mst(a,k) memset(a,k,sizeof(a)) #define Abs(x) ((x) > 0 ? (x) : -(x)) const int mod = 1e9 + 7; inline int MOD(int x) { while (x < 0) x += mod; while (x >= mod) x -= mod; return x; } namespace Newstd { char buf[1 << 21],*p1 = buf,*p2 = buf; inline int getc() { return p1 == p2 && (p2 = (p1 = buf) + fread(buf,1,1 << 21,stdin),p1 == p2) ? EOF : *p1 ++; } inline int read() { int ret = 0,f = 0;char ch = getc(); while (!isdigit(ch)) { if(ch == '-') f = 1; ch = getc(); } while (isdigit(ch)) { ret = (ret << 3) + (ret << 1) + ch - 48; ch = getc(); } return f ? -ret : ret; } inline void write(int x) { if(x < 0) { putchar('-'); x = -x; } if(x > 9) write(x / 10); putchar(x % 10 + '0'); } } using namespace Newstd; using namespace std; int l,r; #undef int int main(void) { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif #define int long long l = read(),r = read(); int p = (1ll << 62); while (p && (l & p) == (r & p)) p >>= 1ll; if (p) printf("%lld\n",(p << 1ll) - 1); else puts("0"); return 0; }