二维差分(看不懂打我)
作者:
巷港
,
2022-02-15 21:57:33
,
所有人可见
,
阅读 198
差分矩阵
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1010;
int a[N][N],b[N][N]; //a表示原数组(也是b的前缀和数组),b表示a的差分数组(即a是b的前缀和数组)
int n,m,q;
int main()
{
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]);
//由二维前缀和数组a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+b[i][j]移项可得吧b[i][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[x1][y2+1]-=c,b[x2+1][y1]-=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");
}
return 0;
}