令
cntx,i 表示前
i 个数中
x 出现的次数,
p1x,i 为下标小于
i 的第一个
x 的下标。
假设询问区间为
[L,R],令
y=i,
ai=2p ,则
ai 对答案的贡献为
(cnt4p,p14p,i−cnt4p,p14p,L)(cnt3p,p13p,R−cnt3p,p13p,i) ,
展开可得:
cnt4p,p14p,icnt3p,p13p,R−cnt3p,p13p,icnt4p,p14p,i−cnt4p,p14p,Lcnt3p,p13p,R+cnt4p,p14p,Lcnt3p,p13p,i 。
对于区间范围内左侧没有
ax ,或右侧没有
az 的
ai,它们对答案没有贡献,直接去掉即可。假设去掉部分
ai 后剩下了
num 个。
于是询问的答案
Ans=cnt3p,p13p,R∑i=LRcnt4p,p14p,i−∑i=LRcnt3p,p13p,icnt4p,p14p,i−num∗cnt4p,p14p,Lcnt3p,p13p,R+cnt4p,p14p,L∑i=LRcnt3p,p13p,i 。
其中
cntx,i ,
∑i=LRcnt4p,p14p,i ,
∑i=LRcnt3p,p13p,icnt4p,p14p,i ,
∑i=LRcnt3p,p13p,i 均可以使用前缀和维护,
num 可以在每次询问时二分求出。本题值域在
2×105 范围内,可以开 vector 数组直接存而无需离散化。
均摊下来,时间复杂度
O(n+mlogn) ,空间复杂度
O(n)。
这样就做完了,并不需要莫队之类的数据结构。