据说莫队更简单,然而不会啊
题目链接
考虑维护一个数组 D,使得 Dl,Dl+1,…,Dr−1,Dr 的和为询问 [l,r] 的答案。用线段树或树状数组都行(显然树状数组比较好写)。从左边开始遍历数组,当下标为 i 时,我们应该处理完所有 r=i 的询问。
下面我们用一个最简单的例子来说明这个思路(下标从 1 开始):
A:3,3,3,3,3D:0,0,0,0,0
当 i=3 时,3 这个数第一次出现 3 次,所以我们应让 D1+1,这样只有 [1,3] 这个询问才会得到 1。
当 i=4 时,按照刚才的想法,我们应让 D2+1:
A:3,3,3,3,3D:1,1,0,0,0
但这时如果我们有 [1,4] 的询问,那么就会得到 2,但答案应该为 0,所以我们这时应将 D1−2:
A:3,3,3,3,3D:−1,1,0,0,0
这样就能正确处理 [1,4] 的询问了。
现在 i=5 了,如果延续刚才的思路,现在应该是这样的:
A:3,3,3,3,3D:−1,−1,1,0,0
这样一来,[1,5] 的询问又不对了,所以我们应该让 D1+1 来抵消第二步。这就是这个题的基本思路。
代码