前缀合和差分
前缀和和差分,只需要分别记住2个公式,一个是预处理的,一个是最后求解/操作的。
前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和,而差分可以看成前缀和的逆运算。合理的使用前缀和与差分,可以将某些复杂的问题简单化。
前缀和
前缀和技巧适用于快速、频繁地计算一个索引区间内的元素之和。
一维前缀和
下图两个重要公式
公式推导 – 一维前缀和还是挺简单的,不需要画图啥的
经典题目
二维前缀和
预处理公式 – 不用死记,画图(i,j图)就能推出来,注意 = 号右侧有个a[] [] – 拼成一块大方形
求解公式 – 也不用死记,画图(x1,y1 x2,y2图)就能推出来(注意画的图和上面那个是不一样的)-- 减成一块小的矩形
经典例题
上面例题共用原数组和前缀和数组了
还要注意一点,x2,y2需要在x1,y1后面,比如遍历的时候
差分
类似于数学中的求导和积分,差分可以看成前缀和的逆运算。
一维差分
如果a[] 的前缀和数组是 s[], 那么a[]就是s[]的差分数组 !!!
差分数组的原理
差分数组初始化
b[i] = a[i] - a[i - 1]; //构建差分数组 ,a为前缀和数组
经典例题
最后构建前缀和那里,题解共用数组了 – 在b数组的基础上求前缀和数组 – 覆盖
上面例题的思路: 想对a进行操作(区间上都加上某个数),先求a对应的差分数组,然后处理差分数组,最后在构建一个新的前缀和数组(就是完成操作后的a!!!)
二维差分
构造方法 – 画个(i,j图就能推出来) – 和 二维前缀和推导公式差不多
操作公式 – 画图也容易理解 和 一位差分很类型–需要打补丁哈哈
经典例题
上面例题的思路: 想对a进行操作(区间上都加上某个数),先求a对应的差分数组,然后处理差分数组,最后在构建一个新的前缀和数组(就是完成操作后的a!!!) – 和一维例题的思路完全一样!!!
总结
前缀和 和 差分 其本质都要预处理的,只不过一个是预处理求前缀合数组,一个是求差分数组
他们每一个维度都对应着有两个公式 。初始化,求解公式。一维的都比较简单,基本都可以直接写出来,二维的也不需要背,会画图就能推出来!
前缀和 的题就是求 某个区间里的和为多少/快速的求某区间的和,个数
差分 的题就是 想对某一个区间的值进行操作(±某值),然后 问/输出 操作后的数组, 差分通常需要配合前缀和一起使用 – 先差分 后 前缀和
蓝桥杯里的前缀和
以前的写法,暴力dp
优化后的
此文章用于笔者记录学习,也希望对你有帮助