首先可以把原问题转化为下面的问题:
给定值域区间 [l,r],有集合 S={x∣∃i∈[l,r)∩N,x=i⊕(i+1)},求 ∣{x∣∃T∈S∧T=∅,x=i∈T⨁i}∣。
证明用异或的自反性,a⊕b=(a⊕(a+1))⊕((a+1)⊕(a+2))⊕…⊕((b−1)⊕b)(a<b)即可简单证明。
然后有关键结论:对于任意整数 x,都有 x⊕(x+1)=2k−1(k∈N),也就是 ∣S∣∼O(logn)。此时直接用线性基维护可以做到 O(qlog2n) 解决问题。
考虑继续优化时间复杂度。注意到 ∀i∈S,i=2k−1(k∈N),所以考虑模拟线性基:注意到此时线性基插入的所有数都会被成功插入(每个数都不能用其他数的异或来表示),所以答案即为 2∣S∣−1。而计算 ∣S∣ 是简单的,可以 O(logn) 处理。因此总时间复杂度为 O(qlogn) 可以通过该题。
namespace Loyalty
{
inline void init() {}
inline void main([[maybe_unused]] int _ca, [[maybe_unused]] int _atc)
{
int l, r;
cin >> l >> r;
int cnt = 0;
for (int i = 0; i < 60; ++i)
if ((r >> i) - (l >> i) != (r >> (i + 1)) - (l >> (i + 1)))
++cnt;
cout << (1ll << cnt) - 1 << '\n';
}
} // namespace Loyalty
喜欢的话,留下你的评论吧~