#include<iostream>
using namespace std;
const int N=1010;
int a[N][N],b[N][N];//原数组,差分数组
int n,m,q;
void insert(int x1, int y1, int x2, int y2, int c)
{
b[x1][y1] += c;
b[x2 + 1][y1] -= c;
b[x1][y2 + 1] -= c;
b[x2 + 1][y2 + 1] += c;
}
int main()
{
cin>>n>>m>>q;
//输入原数组的值
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
//初始化b[]
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
insert(i,j,i,j,a[i][j]);
while(q--)
{
int x1,y1,x2,y2,c;
//b[l,r]+c
cin>>x1>>y1>>x2>>y2>>c;
insert(x1,y1,x2,y2,c);
}
//求前缀和
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
b[i][j]=b[i-1][j]+b[i][j-1]-b[i-1][j-1]+b[i][j];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<b[i][j]<<" ";
}puts("");//换行
}
return 0;
}
注意最后有两种写法:
//求前缀和
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
b[i][j]=b[i-1][j]+b[i][j-1]-b[i-1][j-1]+b[i][j];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<b[i][j]<<" ";
}puts("");//换行
}
//求前缀和
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+b[i][j];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<a[i][j]<<" ";
}puts("");//换行
}
区别在于一个是原地求前缀和,一个是另辟空间求前缀和: