25 Nov 2020 1490字 5分 21次 位运算
如果这篇博客帮助到你,可以请我喝一杯咖啡~
CC BY-NC-SA 4.0 (除特别声明或转载文章外) 首先,将一个数与上另一个数,这个数 1 的数量不增,所以当左端点固定时,区间的与和最多只有 log 种取值。
对于与和相同且左端点固定的区间,我们只需要在 O(log) 的时间内找到其中有多少个区间异或和等于这个固定的与和即可,设区间端点为 l,r。
我们求出原数列的异或前缀和,设为数列 b,则 ⊕i=lrai=br⊕bl−1,设与和为 x 我们求的就是 i=l∑r[bi⊕bl−1=x]=i=l∑r[bi=bl−1⊕x],bl−1⊕x 当区间固定时是定值,所以问题被转化为经典问题,求区间内给定数的出现次数,由于询问次数是 O(nlogai) 所以我们要在 O(log) 内完成查询,使用 vector 里二分或主席树均可。
总复杂度 O(nlogailogn)
代码