Acwing 二维差分模板

51 阅读1分钟

image.png image.png

#include<iostream>
using namespace std;
const int N=1010;
int a[N][N],b[N][N];//原数组,差分数组
int n,m,q;

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;
}
int main()
{
      cin>>n>>m>>q;
      
      //输入原数组的值
      for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++)
      cin>>a[i][j];
  
  //初始化b[]
   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;
        
        //b[l,r]+c
        cin>>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++)
        {
            cout<<b[i][j]<<" ";
        }puts("");//换行
    }
  


    return 0;
}

注意最后有两种写法:

 //求前缀和
      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++)
        {
            cout<<b[i][j]<<" ";
        }puts("");//换行
    }
 //求前缀和
      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++)
        {
            cout<<a[i][j]<<" ";
        }puts("");//换行
    }

区别在于一个是原地求前缀和,一个是另辟空间求前缀和:

image.png