思路
分治、贪心。记 $f(l, r)$ 为 $[l, r]$ 中所有数的二进制表示中 $1$ 最多的数,则
- 若 $l = r$,则 $f(l, r) = l$。
- 否则,若 $2^b \le l$,其中 $b$ 是最大的整数满足 $2^b \le r$(即 $2^b$ 是 $r$ 的最高位),则 $f(l, r) = f(l - 2^b, r - 2^b) + 2^b$。
- 否则,若 $2^{b + 1} - 1 \le r$,则 $f(l, r) = 2^{b + 1} - 1$。
- 否则 $f(l, r) = 2^b - 1$。
时间复杂度 $O(logr)$。
#include <iostream>
using namespace std;
using ULL = unsigned long long;
ULL f(ULL l, ULL r, ULL b) {
if (l == r) return l;
while (b > r) b >>= 1;
if (b <= l) return f(l ^ b, r ^ b, b >> 1) | b;
if ((b << 1) - 1 <= r) return (b << 1) - 1;
return b - 1;
}
void solve() {
ULL l, r;
cin >> l >> r;
cout << f(l, r, 1ULL << 63) << endl;
}
int main() {
cin.tie(0)->sync_with_stdio(0);
int n;
cin >> n;
while (n--) solve();
return 0;
}