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