ACwing : 798. 差分矩阵

Posted smartljy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACwing : 798. 差分矩阵相关的知识,希望对你有一定的参考价值。

不得不说之前的差分我真的是掌握的不好。。

一维差分确实简单一看就会,但是学会了之后却并不能灵活的运用。

而二维的差分我甚至还琢磨了很长时间

懒得画图所以没有图。。
对于二维差分的定义,百度百科是这么说的

 

顾名思义,就是在矩阵中,一行(一列)的元素与上一行(上一列)对应元素的差值,依次排列在上一行(上一列)元素对应所在位置。

(好像说的是矩阵差分,但是问题不大)

但是只要你用模板代码打出一个差分数组就会发现这个数组的排列并不规律,换句话说我并没有看懂这个。。

因此我们完全可以忽略差分数组一个点的意义

只需要抓住其前缀和是原来数值的特点进行修改即可

而每次更新时都可以将其拆解为两个一维的数组去处理

 

#include<bits/stdc++.h>
#define R register int
using namespace std;
const int maxn=1002;
int m,n,q;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<0||ch>9) if(ch==-) f=-1,ch=getchar();
    while(ch>=0&&ch<=9) x=(x<<3)+(x<<1)+ch-0,ch=getchar();
    return x*f;
}int a[maxn][maxn];
inline void insert(int x1,int y1,int x2,int y2,int v)
{
    a[x1][y1]+=v;
    a[x2+1][y1]-=v;
    a[x1][y2+1]-=v;
    a[x2+1][y2+1]+=v;
}

int main()
{
    int i,j;
    n=read();m=read();q=read();
    for( i=1;i<=n;i++)
    for( j=1;j<=m;j++)
    {
        int x=read();
        insert(i,j,i,j,x);
    }
    for( i=1;i<=q;i++)
    {
        int x1=read(),y1=read(),x2=read(),y2=read(),c=read();
        insert(x1,y1,x2,y2,c);
    }
    for(i=1;i<=n;i++)
     for( j=1;j<=m;j++)
      a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
    for( i=1;i<=n;i++)
    {
        for( j=1;j<=m;j++)
        printf("%d ",a[i][j]);
        puts("");
    }
    return 0;
}

 

 

 

以上是关于ACwing : 798. 差分矩阵的主要内容,如果未能解决你的问题,请参考以下文章

ACwing : 798. 差分矩阵

AcWing 798. 差分矩阵

AcWing 798.差分矩阵

798. 差分矩阵

前缀和和差分模板(AcWing 795-798)

蓝桥杯AcWing 题目题解 - 二分与前缀和差分