https://codeforces.com/problemset/problem/484/A
知识点:贪心,位运算。
每位独立考虑,要使 \(1\) 的数量最大,且答案最小,因此从低位开始遍历,在不超过 \(r\) 的情况下把 \(l\) 每位变 \(1\) 。
(一开始直接写了个结论,但太烦了qwq)
时间复杂度 \(O(1)\)
空间复杂度 \(O(1)\)
#include <bits/stdc++.h> #define ll long long using namespace std; /* bool solve() { long long l, r; cin >> l >> r; long long tmp = l ^ r; int pos = -1; while (tmp) { pos++; tmp >>= 1; } cout << (!~pos || ((1LL << pos) - 1 | r) == r ? r : ((l & r) | (1LL << pos) - 1)) << '\n'; return true; } */ bool solve() { long long l, r; cin >> l >> r; for (int i = 0;i < 63;i++) { if ((l | (1LL << i)) <= r)l |= (1LL << i); else break; } cout << l << '\n'; return true; } int main() { std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int t = 1; cin >> t; while (t--) { if (!solve()) cout << -1 << '\n'; } return 0; }