做这道题起因是,无意中发现了一个叫 zkw 线段树
的东西 QAQ,从下往上遍历挺有意思的,不仅非递归,而且常数很低。这题用线段树就能无脑解决吧,后来从网上发现有树状数组解决的,差分的思想可以学习。
zkw 线段树解法
线段树节点记录三个值:
- nc:子树的包含的点数
- add:对子树的每个值的加数
- sum:子树和,不含其父节点们的加数
1 |
|
运行时间 1266ms
。
树状数组解法
记原数组为 ,令 (),那么有 ,原题的对 [l, r] 加 v 操作就变成了改变两个数:
加下来看对 [l, r] 的和查询,方便起见,可以把结果看作 [1, r] 的和减去 [1, l - 1] 的和,即我们只需考虑 [1, x] 的和:
于是,我们需要在维护 的同时维护 ,代码里 。
1 |
|
运行时间 969ms
。