好久没写过莫队了,今天回来练练手。
其实这题我早就想写了,但是因为鸽子属性咕了很久……
闲来无事,没想到十分钟左右就写完了(
设 \(f(i,x) = \text{get}(1,i,x)\)。
那么有
\[\begin{eqnarray}
& & \text{get}(l_1,r_1,x) \cdot \text{get}(l_2,r_2,x) \\
& = & (f(r_1,x) - f(l_1 - 1,x)) \cdot (f(r_2,x) - f(l_2 - 1,x)) \\
& = & f(r_1,x)f(r_2,x) - f(r_1,x)f(l_2 - 1,x) - f(l_1 - 1,x)f(r_2,x) + f(l_1 - 1,x)f(l_2 - 1,x)
\end{eqnarray}\]
那么我们把每个询问 \((l_1,r_1,l_2,r_2)\) 都拆成 \((r_1,r_2) - (r_1,l_2 - 1) - (l_1 - 1,r_2) + (l_1 - 1,l_2 - 1)\) 的形式。
就能得到 \(4Q\) 个只跟两个位置有关的询问。
然后发现询问里面有乘,没法用数据结构维护这个东东。
考虑上莫队。
当然和一般的莫队不同,稍微注意一下就好了。
只要理解了莫队应该都很容易写出来。
代码:
1 |
|