(i j 为行列最大值)
先构造 b[i][j],使得a[i][j]为b[i][j]的前缀和矩阵(逆推)
此时若使 b[x][y]+=c 相当于 a[i][j]中 i,x,j,y 矩阵中的值均+c
对b[i][j]-c 同理。
所以有 对a[i][j] 中的 x1,y1,x2,y2 矩阵进行+c操作
相当于对a 进行如下操作
1: 对 x1 i y1 j 矩阵 + c
2: 对 x2+1 i y1 j 矩阵 — c
3: 对 x1 i y2+1 j 矩阵 - c
4: 对 x2+1 i y2+1 j 矩阵 + c //上面两部中多减了一次这个矩阵
以上操作对应到b矩阵中 相当于
b[x1][y1]+=c;
b[x2+1][y1]-=c;
b[x1][y2+1]-=c;
b[x2+1][y2+1]+=c;
修改完b的值后,我们再重新计算a矩阵 即可
include[HTML_REMOVED]
using namespace std;
const int N = 1010;
int a[N][N],b[N][N];
int main()
{
int n,m,q;
scanf(“%d%d%d”,&n,&m,&q);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
b[i][j] = a[i][j] - a[i-1][j] - a[i][j-1] +a[i-1][j-1];
while(q--)
{
int x1,y1,x2,y2,c;
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&c);
b[x1][y1]+=c;
b[x2+1][y1]-=c;
b[x1][y2+1]-=c;
b[x2+1][y2+1]+=c;
}
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++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
}