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;
}
复制代码

 

 

 

本文作者:Gold_stein

本文链接:https://www.cnblogs.com/smartljy/p/11777466.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Gold_stein  阅读(338)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑
  1. 1 逃离地面 RAD & 三浦透子
逃离地面 - RAD & 三浦透子
00:00 / 00:00
An audio error has occurred.

作词 : 野田洋次郎

作曲 : 野田洋次郎

空飛ぶ羽根と引き換えに 繋ぎ合う手を選んだ僕ら

それでも空に魅せられて 夢を重ねるのは罪か

夏は秋の背中を見て その顔を思い浮かべる

憧れなのか、恋なのか 叶わぬと知っていながら

重力が眠りにつく 1000年に一度の今日

太陽の死角に立ち 僕らこの星を出よう

彼が眼を覚ました時 連れ戻せない場所へ

「せーの」で大地を蹴って ここではない星へ

行こう

もう少しで運命の向こう もう少しで文明の向こう

もう少しで運命の向こう もう少しで

夢に僕らで帆を張って 来たるべき日のために夜を超え

いざ期待だけ満タンで あとはどうにかなるさと 肩を組んだ

怖くないわけない でも止まんない

ピンチの先回りしたって 僕らじゃしょうがない

僕らの恋が言う 声が言う

「行け」と言う