给定一个长度为$n$的序列$a$和$q$组询问,对于每组询问,给定$l_1,r_1,l_2,r_2$,求
其中,$\operatorname{get}(l,r,x)$表示在区间$[l,r]$中,数字$x$出现的次数。
注意:答案有可能超过$\texttt{int}$的最大值。
$\texttt{Data Range:}n,q\leq 5\times 10^4,1\leq a_i\leq n,1\leq l_1\leq r_1\leq n,1\leq l_2\leq r_2\leq n$
链接
题解
文化课选手$\texttt{Karry5307}$终于更博了qwq!
首先,显然会有
右边的和式是可以拆成前缀和的形式的,就暴力拆一下,于是有
我们定义一个$\operatorname{g}(r,x)=\operatorname{get}(1,r,x)$,拆一下式子,有
展开一下里面的括号
拆成四个询问维护一下就好了
这里说说转移。
首先考虑从$\sum\limits_{x=0}^{\infty}\operatorname{g}(l,x)\operatorname{g}(r,x)$转移到$\sum\limits_{x=0}^{\infty}\operatorname{g}(l+1,x)\operatorname{g}(r,x)$会发生什么。
为了接下来好懂,这里开两个数组,$cntl$和$cntr$。$cntl_i$指$a_1\sim a_l$中$i$的出现次数,$cntr_i$,相应的为$a_1\sim a_r$中$i$的出现次数。
不难发现
这个的话,把求和符号展开一下就行了。
所以说,这样的转移应该是$++cntl_{a_{l+1}},res+=cntr_{a_{l+1}}$的。
剩下三种情况在这里就不详细解释了,推的方法也是这个样子的。
于是就可以完结撒花了qwq!
代码
1 |
|