ACwing算法基础课听课笔记(第一章,基础算法二)(差分)

时间:2022-01-05 10:36:52

    前缀和以及二维前缀和在这里就不写了。

    差分:是前缀和的逆运算

    ACWING二维差分矩阵

     

     每一个二维数组上的元素都可以用(x,y)表示,对于某一元素(x0,y0),其前缀和就是以该点作为右下角以整个数组的起始点作为左上角的矩形区域内所有元素的和。【如下图的红色区域,其中六个元素的和就是(x0,y0)的前缀和】

#include<cstring>
#include<iostream>
using namespace std;
const int maxn=;
int n,m,q;
int a[maxn][maxn],b[maxn][maxn];
void insert(int x1,int y1,int x2,int y2,int c)
{
b[x1][y1]+=c;
b[x2+][y1]-=c;
b[x1][y2+]-=c;
b[x2+][y2+]+=c;  //b[x][y]是以x,y为左上角,一直到右下角的部分。画图可推
}
int main()
{
cin>>n>>m>>q;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
cin>>a[i][j]; for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
insert(i,j,i,j,a[i][j]);
while(q--)
{
int x1,y1,x2,y2,c;
cin>>x1>>y1>>x2>>y2>>c;
insert(x1,y1,x2,y2,c);
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
b[i][j]+=b[i-][j]+b[i][j-]-b[i-][j-];
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
cout<<b[i][j]<<" ";
cout<<endl;
} }

参考博客:https://blog.csdn.net/D5__J9/article/details/89428614