题目描述
算法思想
和一维差分一样 一维差分
题解
构造一个新的数组b[N][N]使原来的数组a[N][N]里面的每一个元素都是数组b里面元素的前缀和
完整代码
#include<stdio.h>
#define N 1001
void insert(int x1, int y1, int x2, int y2, int c);
int a[N][N], b[N][N];
int main(void)
{
int n,m,q,i,j; scanf("%d%d%d",&n,&m,&q);
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
scanf("%d",&a[i][j]);
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
insert(i,j,i,j,a[i][j]);
while(q--)
{
int x1,y1,x2,y2,c; scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&c);
insert(x1,y1,x2,y2,c);
}
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
b[i][j]+=b[i][j-1]+b[i-1][j]-b[i-1][j-1];//给b数组求前缀和得到原来的a数组
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)printf("%d ",b[i][j]);
puts("");
}
}
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;
}