差分矩阵(二维差分)

在这里插入图片描述
在这里插入图片描述

思路:二维差分,差分矩阵为a[i][j],原矩阵为b[i][j],a[i][j]+=c的意思是以i,j为左上角n,m为右下角的子矩阵全部加c与一维差分一样我们需要抵消多余的,最后求前缀这里是求二维前缀。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define space putchar(' ')
#define enter putchar('\n')

template <class T>
void read(T &x){
    char c;
    bool op = 0;
    while(c = getchar(), c < '0' || c > '9')
	if(c == '-') op = 1;
    x = c - '0';
    while(c = getchar(), c >= '0' && c <= '9')
	x = x * 10 + c - '0';
    if(op) x = -x;
}
template <class T>
void write(T x){
    if(x < 0) x = -x, putchar('-');
    if(x >= 10) write(x / 10);
    putchar('0' + x % 10);
}

int a[1005][1005];
int b[1005][1005];
void update(int x1,int y1,int x2,int y2,int c)
{
    a[x1][y1]+=c;
    a[x2+1][y1]-=c;
    a[x1][y2+1]-=c;
    a[x2+1][y2+1]+=c;
}
int main(){
    int n,m,q;
    read(n),read(m);read(q);
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
        read(b[i][j]);
          for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
        update(i,j,i,j,b[i][j]);
    while(q--)
    {
        int x1,y1,x2,y2,c;
        read(x1),read(y1),read(x2),read(y2),read(c);
        update(x1,y1,x2,y2,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];
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            printf("%d ",a[i][j]);
        enter;
    }

    return 0;
}

相关推荐
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:马嘣嘣 返回首页