1 条题解
-
0
序列变换
算法思路
交换求和顺序,并利用相邻项抵消,可以得到
$$E=\sum_{j=1}^{n-1}b_{j} \left(\sum_{i=j}^{n-1}(a_{i}-a_{i+1})\right) =\sum_{j=1}^{n-1}b_{j}(a_{j}-a_{n}).$$由于第 项 ,可以将求和范围扩展到 。
维护两个量
$$B=\sum_{i=1}^{n}b_{i},\qquad C=\sum_{i=1}^{n}a_{i} b_{i},$$于是能量值可以写成
初始化时扫描两个序列,计算 和 。之后按以下方式处理事件:
-
修改 :将 增加 ,再将 增加 。
-
修改 :将 增加 ,将 增加 ,再将 增加 。
-
查询:输出 ,其中 。
所有数组元素和维护的总量都在模 意义下保存。负数可通过 转为非负余数,乘法使用 64 位整数。查询时始终使用当前的 。
正确性证明
由上述求和变形,始终有 。
修改 时, 中只有 一项发生变化,增量为 ;修改 时, 的增量为 , 的增量为 。因此,两类修改都能正确维护 、 和数组的当前值。
查询时利用恒等式计算 ,并且取模与加减乘运算相容,所以算法输出正确。
复杂度分析
初始化需要 时间,每次修改和查询均为 ,总时间复杂度为 。
保存两个序列需要 空间。
-
信息
- ID
- 724
- 时间
- 1000ms
- 内存
- 256MiB
- 题目 Rating
- 标签
- 递交数
- 13
- 已通过
- 4
- 上传者