- chjshen 的博客
基础算法-前缀和与差分
- 2023-5-26 17:27:29 @
枚举优化算法:前缀和与差分
1. 前缀数组
题目:给定长度为 的数组 及其每一项的值,询问 到 之间的数的和(区间和)。
枚举思路:循环累加 到 之间每一项即可。 但若是询问 次,且每次区间都不相同呢?
若仍然采用每次询问都累加的方法,当 较大时,循环就很耗时了,超出 秒就不得分。
前缀数组:, 数组下标均从 开始, 号下标值为 。
含义: 表示 的和。 那么要计算 到 之间的区间和,只需要计算 即可,循环变成了减法,效率提升。
如果求完前缀后原数组无用,也可以直接在原数组上执行 变为前缀数组。
例题 |
---|
p643 前缀和 |
2. 差分数组
题目:给定长度为 的数组及其每一项的值,操作 到 之间的每个数都加 (区间操作)。
枚举思路:循环 到 ,每个数都加 1 即可。 但若是 次操作,且每次操作区间都不同呢?
若仍然采用每次操作都循环的方法,当 较大时肯定也会超时。
差分数组: 两个数组下标均从 1 开始,0 号下标值为 0。
含义:差分数组存储的是差值, 到 内每个数加上 ,那么区间内相邻的数间的差值不变,变的只有首尾两个差值。
即:
若操作结束后想还原回原数组,只需要对差分数组求前缀和即可。
例题 |
---|
p644 差分 |
3. 前缀差分总结
例题 |
---|
abc281c C - Circular Playlist |
前缀数组适合求区间和,差分数组适合处理区间操作。
前缀数组的差分数组是原数组,差分数组的前缀数组的原数组。
练习
练习题 |
---|
P153小 X 与煎饼达人(flip) |
P275计算能力 |
P277倒水 |
P680语文成绩 |
进阶
二维前缀和和差分
例题 |
---|
P276子矩阵求和 |