给你一个长为 $n$ 的序列 $a$ 和一个常数 $x$。
$m$ 次询问,每次询问给出区间 $[l,r]$,查询区间中满足 $i < j \wedge (a_i \oplus a_j) \le x$ 的 $(i,j)$ 个数。
$1 \le n,a_i,x \le 2 \times 10^5,1 \le m \le 10^6$。
莫队二次离线
需要会莫队二次离线,于是学一下,看 板子。
给你长为 $n$ 的序列 $a$ 和一个常数 $k$。
$m$ 次询问,每次询问给出区间 $[l,r]$,查询区间中满足 $i < j \wedge \texttt{popcount}(a_i \oplus a_j) = k$ 的 $(i,j)$ 个数。
$1 \le n,m \le 10^5$,$0 \le a_i,k < 2^{14}$。
莫队,但直接做移动端点复杂度过高,不可接受。
考虑端点移动对当前答案造成的影响,记 $f(j,[l,r])$ 为 $i \in [l,r]$ 的合法 $(i,j)$ 数量,那么 $[l,r] \to [l,r+\Delta]$ 时,当前答案增加
同理,$[l,r-\Delta],[l+\Delta,r],[l-\Delta,r]$ 答案分别增加
有两个和式组成,前者直接预处理即可,时空复杂度均为 $O(n)$。对于后者,可以直接记录所有需计算的 $f$,扫描线计算,时空复杂度均为 $O(n\sqrt{n})$。发现只需记录 $i$ 的区间,这样空间复杂度就是 $O(n)$ 了。
时间复杂度 $O(\binom{14}{k}n+n\sqrt{m})$,空间复杂度 $O(n)$。
1 |
|
回到本题
先莫队二次离线。需要维护一个集合 $S$,对于数 $v$,快速查询 $i \in S,i \oplus v \le x$ 的 $i$ 的个数。
考虑维护一个桶 buc,插入 $v$ 时,令 $\forall 0 \le i \le x, buc_{i \oplus v} \gets buc_{i \oplus v}+1$。
若 $x$ 形如 $2^k - 1$,可以简单处理,否则可以从高到低按位考虑,需要进行区间加,按 $2^9$ 分块即可。
1 |
|