前缀和与差分

前缀和 & 差分

前缀和

前缀和是一种重要的预处理,能大大降低查询的时间复杂度。我们可以简单理解为“数列的前 n 项的和”。

二维/多维前缀和

其实前缀和几乎都是基于容斥原理,所以各种拓展自己手推一下就行了。
这里用二维前缀和为例讲解一下前缀和扩展到多维的方式。

比如我们有这样一个矩阵 a ,可以视为二维数组:

1 2 4 3
5 1 2 4
6 3 5 9
前缀和数组为:
1 3 7 10
6 9 15 22
12 18 29 45
sum(i,j)=sum(i-1,j)+s(i,j-1)-sum(i-1,j-1)+a[i][j]
对于任意子矩阵(x1,y1)-(x2,y2)
前缀和为:sum(x2,y2)-sum(x1-1,y2)-sum(x2,y1-1)+sum(x1-1,y1-1)
题目链接: https://www.luogu.com.cn/problem/P1387 这道题目的参考程序来帮助大家理解二维前缀和。
思路:求矩阵和,枚举边长
差分

 

 

题目链接:https://www.luogu.com.cn/problem/P3397 二维差分
二维差分定义:b[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1]
二维差分的修改操作:
for(int i=0;i<m;i++){//m是修改操作次数 
    int x1,y1,x2,y2,p;
    cin>>x1>>y1>>x2>>y2>>p;
    b[x1][y1]+=p;b[x2+1][y2+1]+=p;
    b[x2+1][y1]-=p;b[x1][y2+1]-=p;
}

 



posted @ 2019-12-06 20:06  blueattack  阅读(367)  评论(0编辑  收藏  举报