算法学习日志01-前缀和与差分
前缀和与差分
0.核心代码
一维
a[i]=a[i-1]+diff[i]; |
二维
s[i][j]=a[i][j]+s[i][j-1]+s[i-1][j-1]-s[i-1][j-1];//前缀和 |
1.前缀和定义
- 对于q次询问
- 先把s[i]求出,随后求sum[l,r],就可以降低时间复杂度。一次询问复杂度为O(1)。总复杂度成为O(n)
- 若用遍历,每次询问sum[l,r]的复杂度为O(n).总共则是O(q*n)
2.差分
- 问题:
对于一个数组a的一个区间[L,R],要求全部加x。- 一般方法:遍历数组加上x。单次的复杂度为O(n),总为O(mn),若n和m过大就会超时。
- 采用==差分法==:对这个数组的差分数组diff[]。对diff[L]+x,对diff[R+1]-x,再对该差分数组进行前缀和运算。//
或者a[i]=a[i-1]+diff[i]
便可以求出加完之后的数组。
多次区间修改也是一样。
差分数组的由来
差分数组是原数组前缀和的逆运算,即a[i]-a[i-1]=diff[i]一个点的值就是会影响它的差分数组的前缀和
差分数组的前缀和=原数组
直接用差分数组b[n]求a[n]的前缀和
3.扩展到二维
也可以是a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+a[i][j]
直接将原数组代替
求红色矩阵,容斥原理:黑-绿-绿+蓝
定理:在红色处+x,右下角都会+c
推导:想在一个区间+c
- 例题
- 题解
4题目
1.洛谷P1387 最大正方形
- 思路
采用暴力+前缀和
从大到小的边长遍历,并遍历数组的各个边长的矩阵的sum是否为边长^2
- 题解
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Serein!
评论