前缀和 & 差分
前缀和¶
前缀和是一种重要的预处理,能大大降低查询的时间复杂度。我们可以简单理解为“数列的前 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; }