HAOI2012 高速公路
一道非常好的线段树题。
Sol.
优先想到线段树,考虑怎么维护。
记第 \(i\) 到第 \(i+1\) 条边为第 \(i\) 条边,将问题转化成维护 \(n-1\) 个数。
那么,我们维护一个前缀和 \(sum\),根据题意:
\[ Ans=\frac{\sum\limits_{i=l}^{r}\sum\limits_{j=l}^{r}sum_j-sum_i}{\binom{r-l+1}{2}}(i\neq j) \]
下面的东西很好算,重点是上面的东西怎么维护。
我们把上面的东西记作 \(ans\),考虑枚举每条边被计算的次数,可以理解成枚举每个点左右两条路。
所以:
\[ \begin{split} ans &=\sum\limits_{i=l}^{r}a_i\times (r-i+1)(i-l+1)\\ &=\sum\limits_{i=l}^{r}a_i\times (ir-lr+r-i^2+il-i+i-l+1)\\ &=\sum\limits_{i=l}^{r}a_i\times (-i^2+(l+r)i-lr+r-l+1)\\ &=-\sum\limits_{i=l}^{r}a_i\times i^2+(l+r)\sum\limits_{i=l}^{r}a_i\times i+(r-l-lr+1)\sum\limits_{i=l}^{r}a_i \end{split} \]
现在需要维护 \(sum_1=\sum_{i=l}^{r}a_i\times i^2\),\(sum_2=\sum_{i=l}^{r}a_i\times i\),\(sum_3=\sum_{i=l}^{r}a_i\)。
即变成:
\[ans=-sum1+(l+r)sum2+(r-l-lr+1)sum3\]
考虑 pushup
的时候,直接相加就可以了。
考虑在区间 \([L,R]\) 加上一个 \(x\) 的时候怎么做:
\[ \begin{split} sum_3' &= \sum\limits_{i=L}^{R}(a_i+x)\\ &= (R-L+1)x+\sum\limits_{i=L}^{R}a_i\\ &= (R-L+1)x+sum_3\\ \Delta sum_3 &= (R-L+1)x \end{split} \]
直接维护。
\[ \begin{split} sum_2' &= \sum\limits_{i=L}^{R}i(a_i+x)\\ &= \sum\limits_{i=L}^{R}i\times a_i+\sum\limits_{i=L}^{R}ix\\ &= \sum\limits_{i=L}^{R}i\times a_i+x\sum\limits_{i=L}^{R}i\\ &= x\sum\limits_{i=L}^{R}i+sum_2\\ \Delta sum_2 &= x\sum\limits_{i=L}^{R}i \end{split} \]
维护区间和。
\[ \begin{split} sum_1' &= \sum\limits_{i=L}^{R}i^2(a_i+x)\\ &= \sum\limits_{i=L}^{R}i^2\times a_i+\sum\limits_{i=L}^{R}i^2x\\ &= \sum\limits_{i=L}^{R}i^2\times a_i+x\sum\limits_{i=L}^{R}i^2\\ &= x\sum\limits_{i=L}^{R}i^2+sum_1\\ \Delta sum_1 &= x\sum\limits_{i=L}^{R}i^2 \end{split} \]
维护区间平方和。
最后求期望约分即可。
Code
1 |
|
- 标题: HAOI2012 高速公路
- 作者: 夏佑 | XiaU
- 创建于 : 2022-09-01 00:00:00
- 更新于 : 2023-09-15 09:14:16
- 链接: https://oi.xiau.ren/LGP2221/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。