题目要我们求解 $\Sigma{((f(l,r))^2)}$,于是我们构造一个 $g(l,r)$ 使得
$$g(l,r)=\frac{f(l,r)\times(f(l,r)+1)}{2}$$
这样,会有
$$(f(l,r))^2=2g(l,r)-f(l,r)$$
然后我们只需要分别求解 $g$ 和 $f$
定义 $last_i$ 表示与 $A_i$ 相等的最近一个 $A_j$ 的下标 $j$。特别地,若没有,则为 $0$。
我们有以下性质:
$$\sum_{l=1}^{r+1}{f(l,r+1)}=\sum_{l=1}^{r}{f(l,r)}+\sum_{l=last_{r+1}+1}^{r+1}{1}$$
这是因为加入一个 $A_{r+1}$ 时,只有当 $l\in[last_{r+1}+1,r+1]$ 时,区间 $[l,r+1]$ 中才会认为 $A_{r+1}$ 一个新的值(在这之外的值会认为是重复的),会导致$f(l,r)$ 的值 $+1$。
遍历区间右端点 $r$,同时构造一棵线段树,它维护的区间 $[1,n]$ 存储 $f(1,r) \sim f(n,r)$ 的值。当 $r$ 变为 $r+1$ 时,$[last_{r+1}+1,r+1]$ 区间 $+1$。
我们又有一个性质:
令 $h(x)=\frac{x\times(x+1)}{2}$,则有
$$
\begin{aligned}
h(x+1)-h(x)&=\frac{(x+1)\times(x+2)}{2}-\frac{x\times(x+1)}{2}\
&=x+1
\end{aligned}
$$
于是
$$\sum_{l=1}^{r+1}{g(l,r+1)}=\sum_{l=1}^{r}{g(l,r)}+\sum_{l=last_{r+1}+1}^{r+1}{f(l,r+1)}$$
这可以用线段树的区间查找操作解决。
开始时构造 $last$ 数组 $\Theta (n \log{n})$,线段树 $\Theta (n \log{n})$,总时间复杂度 $\Theta (n \log{n})$。
代码:
1 |
|