在进行莫队时,若不能快速地在线计算移动区间后的贡献变化,可以考虑将 $O(n\sqrt{n})$ 个移动再次离线,每次 $O(1)$ 求出贡献变化。
这就是所谓莫队二次离线。
注意这里贡献要求具有可减性,因为我们每次求的是贡献变化。
思路
目前,运用该 trick 的题目通常为求区间中合法点对数量。
设 $S([l_1, r_1], [l_2, r_2])$ 为前面的数在 $[l_1, r_1]$ 位置,后面的数在 $[l_2, r_2]$ 位置所组成的合法点对数。
考虑从上一个区间 $[l_1, r_1]$ 转移至当前需求区间 $[l_2, r_2]$ 的过程。不失一般性地,设 $l_1 < l_2, r_1 < r_2$(其他情况可类似推出)。
$$\begin{aligned}
&\ S([l, r], [l, r])\\
&= S([1, r], [1, r]) + S([l, n], [l, n])\\
&+ S([1, l - 1], [r + 1, n]) - S([1, n], [1, n])
\end{aligned}$$
注意到:
$$\begin{aligned}
&\ S([1, l_2 - 1], [r_2 + 1, n]) - S([1, l_1 - 1], [r_1 + 1, n])\\
&= S([l_1, l_2 - 1], [r_2 + 1, n]) - S([1, l_1 - 1], [r_1 + 1, r_2])
\end{aligned}$$
所以:
$$\begin{aligned}
&\ S([l_2, r_2], [l_2, r_2]) - S([l_1, r_1], [l_1, r_1])\\
&= S([1, r_2], [1, r_2]) - S([1, r_1], [1, r_1]) - S([l_1, n], [l_1, n]) + S([l_2, n], [l_2, n]) \\
&- S([1, l_1 - 1], [r_1 + 1, r_2]) + S([l_1, l_2 - 1], [r_2 + 1, n])
\end{aligned}$$
虽然基本每个题都是这个式子,但因为太长实在没有记的必要,直接画出1,n,l_1,r_1,l_2,r_2
现推往往更快。
下面是原来的较为繁琐的推法:
$$\begin{aligned}
&\ S([l_2, r_2], [l_2, r_2]) - S([l_1, r_1], [l_1, r_1])\\
&= S([l_2, r_2], [r_1 + 1, r_2]) - S([l_1, l_2 - 1], [l_1, r_1])\\
&= (S([1, r_2], [r_1 + 1, r_2]) - S([1, l_1 - 1], [r_1 + 1, r_2]))\\
&- (S([l_1, l_2 - 1], [l_1, n]) - S([l_1, l_2 - 1], [r_2 + 1, n]))\\
&= S([1, r_2], [1, r_2]) - S([1, r_1], [1, r_1]) - S([l_1, n], [l_1, n]) + S([l_2, n], [l_2, n]) \\
&- S([1, l_1 - 1], [r_1 + 1, r_2]) + S([l_1, l_2 - 1], [r_2 + 1, n])
\end{aligned}$$
故,不失一般性地,只需考虑 $S([1, r], [1, r]), S([1, l_1 - 1], [r_1 + 1, r_2])$ 的求法。前者一般因题而异且不为难点,故本处只考虑后者。
不妨为每个位置开一个vector
。将一个 $S([1, l_1 - 1], [r_1 + 1, r_2])$ 的询问记录在第 $l_1 - 1$ 个vector
上。
然后使用可以用类似扫描线的做法,依次处理每个vector
上的询问,
例题
「Ynoi2019模拟赛」Yuno loves sqrt technology II
给定长 $O(n)$ 序列,离线 $O(n)$ 次查询区间逆序对,希望做到 $O(n\sqrt{n})$ 复杂度。
主要思路
显然利用树状数组有复杂度 $O(n\sqrt{n}\log n)$ 的莫队,且瓶颈在于计算移动区间后的贡献变化。
$S([1, r], [1, r])$ 可以直接使用树状数组求出。考虑 $S([1, l_1 - 1], [r_1 + 1, r_2])$。
套上上面那套东西,则问题转化为维护可重集,要求 $O(n\sqrt{n})$ 次查询比某数小的元素个数且有 $O(n)$ 次加点。
利用一个值域分块即可做到 $O(\sqrt{n})$ 加点,$O(1)$ 查询。
故总时间复杂度 $O(n\sqrt{n})$,空间 $O(n)$。
1 |
|