二维差分
重点是差分的数组b,而前缀的逆运算,我们假设开始时为零,
然后一个一个点的插进去,更新数组b,最后在进行要求的处理,最后
求一边前缀,就得到目标数组
include [HTML_REMOVED]
include [HTML_REMOVED]
include [HTML_REMOVED]
include [HTML_REMOVED]
using namespace std;
int n,m,q;
const int N =1010;
int a[N][N];
int b[N][N];
void insert(int x1,int y1,int x2,int y2,int c)
{
b[x1][y1] += c;
b[x1][y2+1] -= c;
b[x2+1][y1] -=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)
scanf(“%d”,&a[i][j]);
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;
scanf(“%d%d%d%d%d”,&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)
{
printf(“%d “,b[i][j]);
}
printf(“%d\n”,b[i][m]);
}
return 0;
}