二维前缀和+二维差分
#include<bits/stdc++.h>
using namespace std;
long long n, m, q, a[1005][1005], s[1005][1005], x, y, xx, yy;
//一维前缀和:快速的计算区间和
//s[i]表示前i个数的总和 是s[i]
//s[i]=s[i-1]+a[i]
//二维前缀和:快速地计算 二维数组当中 某一段范围总和
//二维前缀和数组 s[i][j]
//s[i][j]表示a数组的前i行 前j列的总和 是s[i][j]
//s[i][j]=s[i][j-1]+s[i-1][j]-s[i-1][j-1]+a[i][j]
//这个公式要求我们 计算二维前缀和的时候 要从上到下 从左到右开始计算
//如何用二维前缀和 快速的计算某一段范围的总和呢???
//假设我们现在要计算一个小矩形的总和
//这个小矩形 他的左上角坐标是 (x,y) 他的右下角坐标是 (xx,yy)
//s[xx][yy]-s[xx][y-1]-s[x-1][yy]+s[x-1][y-1]
int main(){
}
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int t,n,m,a[N][N],c[N][N];
//二维差分的作用是帮助我们快速的进行区间修改操作
//差分四步走
1.根据原数组 计算出来差分数组
c[i][j]=a[i][j]+a[i-1][j-1]-a[i-1][j]-a[i][j-1]
2.利用差分数组 快速进行区间修改操作
假设我们现在要对一个小矩形 进行加k的操作 左上角的坐标是(x,y) 右下角的坐标是(xx,yy)
c[x][y]+=k
c[xx+1][yy+1]+=k
c[xx+1][y]-=k;
c[x][yy+1]-=k;
3.还原原数组
a[i][j]=c[i][j]-a[i-1][j-1]+a[i-1][j]+a[i][j-1]
4.统计答案
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
c[i][j]=a[i][j]+a[i-1][j-1]-a[i-1][j]-a[i][j-1];
}
}
return 0;
}