差分+差分矩阵(更适合新手宝宝体质)

2023-10-27

快速掌握差分以及差分矩阵

前言

之前我们提到了前缀和数组与前缀和矩阵,现在我们可以类比处差分矩阵,差分数组
,现在我将站在新手的角度为大家介绍,学完差分的小伙伴们也可以复习一下

差分

差分的定义【官方解释】

差分是指在数学中,对于一个数列或函数,通过计算相邻元素之间的差值来得到一个新的数列或函数。差分可以用来描述数列或函数的变化趋势或规律。

对于一个数列 {a1, a2, a3, ..., an},它的一阶差分可以表示为 {d1, d2, d3, ..., dn-1},其中 di = ai+1 - ai

对于一个函数 f(x),它的一阶差分可以表示为 f'(x) = f(x+1) - f(x)

差分可以应用于各种数学领域,如微积分、离散数学、动态规划等。它在数值计算和数据分析中也有广泛的应用,可以用来处理时间序列数据、图像处理、信号处理等问题。

差分自定义【跟前缀和放在一起理解】

对于一个数组{a1, a2, a3, ..., an},我们可以有前缀和s[N],
s[1]=a[1];
s[2]=a[2]+a[1]
s[3]=a[3]+a[2]+a[1]
............
类比对于一个数组{a1, a2, a3, ..., an}
我们有
b[1]=a[1]-a[0]
b[2]=b[2]-b[1]
b[3]=b[3]-b[2]
................
我们叫{b1, b2, b3, ..., bn}{a1, a2, a3, ..., an}的差分数组;

差分数组的应用

对差分数组的前缀和数组进行范围修改;
a[1]=b[1];
a[2]=b[1]+b[2]
a[3]=b[1]+b[2]+b[3]
........................
数组a[N]就是b[N]的前缀和数组,假设我们要对a[N],进行修改,在【l,r】的范围内加上 w,假如直接对数组 a [ N ] 进行遍历操作,那么我们的时间复杂度是 O(N);

但是我们现在有了差分数组,我们就不用对 a [N ]做直接修改了,我们从它的差分数组入手,对 b[left] 进行修改,那么 a[ i ] ,a [ i+1 ] ,a [ i+2 ], a [ i+3] …就会发生改变,但是我们不能让改变一直延续下去,所以要在 b [ right ]处进行修改 【及时进行相反的操作,这样就实现了范围修改

题目描述

输入一个长度为 n 的整数序列。

接下来输入 m个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r]
之间的每个数加上 c

请你输出进行完所有操作后的序列。

输入格式第一行包含两个整数 n 和 m

第二行包含 n 个整数,表示整数序列。

接下来 m 行,每行包含三个整数 l,r,c,表示一个操作。

输出格式
共一行,包含 n 个整数,表示最终序列。

数据范围
1≤n,m≤100000
1≤l≤r≤n
−1000≤c≤1000
−1000≤整数序列中元素的值≤1000
输入样例:
6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1
输出样例:
3 4 5 3 4 2
`

#include<iostream>
using namespace std;
const int N =1e5 +7;
int a[N],b[N];
int n,m;
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        //由于是前缀和,下标要从 1 开始
        cin>>a[i];
        b[i]=a[i]-a[i-1];
    }
    while(m--){
        int l,r,c;
        cin>>l>>r>>c;
        b[l]+=c,b[r+1]-=c;
        //此处不要忘记进行相反的操作
    }
    for(int i=1;i<=n;i++){
        a[i]=b[i]+a[i-1];//重新构建前缀和
        cout<<a[i]<<' ';
    }
}

差分矩阵【与前缀和矩阵进行比较】

有关前缀和矩阵的知识请看我的另2篇博客
激光矩阵问题: https://blog.csdn.net/2302_77698668/article/details/132345058

前缀和求解k倍区间问题: https://blog.csdn.net/2302_77698668/article/details/132339559

差分矩阵定义【官方解释】

差分矩阵是指由差分操作得到的矩阵。在离散数学和图论中,差分矩阵常用于描述图的性质和图算法的设计。

对于一个无向图 G = (V, E),其中 V 是顶点集合,E 是边集合。差分矩阵 D 是一个 |V| × |V| 的矩阵,其中 |V| 表示顶点的个数。差分矩阵的定义如下:

D(i, j) = -1, if i ≠ j and (i, j) ∈ E,
degree(i), if i = j,
0, otherwise.

其中,D(i, j) 表示差分矩阵的第 i 行第 j 列的元素,degree(i) 表示顶点 i 的度数(即与顶点 i 相连的边的个数)。

差分矩阵可以用来描述图的拉普拉斯矩阵,它是一个对称半正定矩阵,具有很多重要的性质和应用。差分矩阵在图论算法中也有广泛的应用,如最短路径算法、最小生成树算法、图分割算法等。

自定义

跟之前一样,我们继续类比推理
a [i] [j] 矩阵【 b[1] [1](左上端点),b[i][j] 右下端点】的和
那么要对 a [ i ] [ j ]进行范围修改,我们就只需要对 b[N][N]进行修改

修改操作【跟前缀和对比】

在这里插入图片描述
在这里插入图片描述
为啥差分是从后面开始进行面积加减呢?
想想我们之前提到的

但是我们现在有了差分数组,我们就不用对 a [N ]做直接修改了,我们从它的差分数组入手,对 b[left] 进行修改,那么 a[ i ] ,a [ i+1 ] ,a [ i+2 ], a [ i+3] …就会发生改变,但是我们不能让改变一直延续下去,所以要在 b [ right ]处进行修改 【及时进行相反的操作,这样就实现了范围修改

差分会对后面的前缀和数组造成影响,对前面的不会影响,一维的数组适用,二维的数组同样适用

题目描述

输入一个 n 行 m 列的整数矩阵,再输入 q
个操作,每个操作包含五个整数 x1,y1,x2,y2,c,其中 (x1,y1)
和 (x2,y2) 表示一个子矩阵的左上角坐标和右下角坐标。

每个操作都要将选中的子矩阵中的每个元素的值加上 c

请你将进行完所有操作后的矩阵输出。

输入格式
第一行包含整数 n,m,q接下来 n 行,每行包含 m
个整数,表示整数矩阵。

接下来 q 行,每行包含 5 个整数 x1,y1,x2,y2,c,表示一个操作。

输出格式
共 n 行,每行 m 个整数,表示所有操作进行完毕后的最终矩阵。

数据范围
1≤n,m≤1000
1≤q≤100000
1≤x1≤x2≤n
1≤y1≤y2≤m
−1000≤c≤1000
−1000≤矩阵内元素的值≤1000
输入样例:
3 4 3
1 2 2 1
3 2 2 1
1 1 1 1
1 1 2 2 1
1 3 2 3 2
3 1 3 4 1
输出样例:
2 3 4 1
4 3 4 1
2 2 2 2
直接上代码

代码

#include<iostream>
using namespace std;
const int N =1e3 +7;
int a[N][N],b[N][N];
int n,m,q;
//这里是对 b 数组进行操作,相当于在(x1,y1)->(x2,y2)范围内加上c
void add(int x1,int y1,int x2,int y2,int c){
    b[x2+1][y2+1]+=c;
    b[x1][y1]+=c;
    b[x2+1][y1]-=c;
    b[x1][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];
            add(i,j,i,j,a[i][j]);
            //通过这个操作只会对 b[i][j]
            //那个点产生影响
        }
    }
    
    while(q--){
        int x1,y1,x2,y2,c;
        cin>>x1>>y1>>x2>>y2>>c;
        add(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];
            //这个是前缀和矩阵的计算公式,建议和之前的一维数组类比一下
            cout<<b[i][j]<<' ';
        }
        puts("");
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

差分+差分矩阵(更适合新手宝宝体质) 的相关文章

随机推荐

  • 二叉树的遍历C#实现,递归以及非递归

    前序遍历 输出规则 根节点 左子树 右子树 二叉树的前序遍历规则是从根节点开始 依层 逐层取 左子节点 若此节点没有 左子节点 说明此节点是叶子节点 往上 回溯 取 最小父节点的右节点 再重复 此步骤 取左子节点 直到 没有左子节点 也没有
  • 结构化方法与面向对象方法的比较

    结构化方法与面向对象方法的比较 一 结构化方法 结构化方法 Structured Methodology 采用了系统科学的思想方法 从层次的角度 自顶向下地分析和设计系统 结构化方法包括结构化分析 Structured Analysis 简
  • 20多岁年轻人应该有多少存款?

    20多岁年轻人应该有多少存款 本人22应届专升本软件工程毕业 在专科阶段做了很多兼职 保安 销售 服务员 兼职只能够个日常开销 还记得疫情那年 我专科还没毕业 被困在家里 后面4月份解封 我就早早的跟朋友去外面找工作 找了一份快递的工作 本
  • 数据结构:Trie字符串统计

    维护一个字符串集合 支持两种操作 I x 向集合中插入一个字符串 x Q x 询问一个字符串在集合中出现了多少次 共有 N 个操作 所有输入的字符串总长度不超过 1e5 字符串仅包含小写英文字母 Trie树 高效存储和查找字符串 按树结构存
  • 机器学习实践(2.1)LightGBM分类任务

    前言 LightGBM也属于Boosting集成学习模型 还有前面文章的XGBoost LightGBM和XGBoost同为机器学习的集大成者 相比越来越流行的深度神经网络 LightGBM和XGBoost能更好的处理表格数据 并具有更强的
  • 【Transformer】2、ViT:An image is worth 16x16: transformers for image recognition at scale

    文章目录 一 背景和动机 二 方法 三 效果 四 Vision Transformer 学习到图像的哪些特征了 五 代码 代码链接 https github com lucidrains vit pytorch 论文连接 https ope
  • Android Listview 以及list view适配器

    Listview 相关监听事件以及滑动按钮 适配器 是来连接数据源和图形化界面的桥梁 数组适配器arrayadapter 集合和数组 格式简单 简单适配器simpleadapter格式复杂 使用过程 星舰 添加数据元到适配器 试图展示 si
  • JAVA中scanner方法详解

    Scanner 是 Java 中的一个比较重要的类 它的作用是用来从控制台读取输入的 它可以接收字符串 整数等类型的输入 使用方法如下 1 使用 Scanner 对象 创建 Scanner 对象并传入要接收输入的字符串 Scanner in
  • 图像边缘特征

    图像边缘是图像的重要特征 是图像中特性 如像素灰度 纹理等 分布的不连续处 图像周围特性有阶跃变化或屋脊状变化的那些像素集合 图像的边缘部分集中了图像的大部分信息 一幅图像的边缘结构与特点往往是决定图像特质的重要部分 图像边缘的另一个定义是
  • scp命令传输出现ssh: Could not resolve hostname错误

    ssh Could not resolve hostname xxxxx Temporary failure in name resolution 原因是docker导出的镜像需要离线导入 在命名的时候根据docker镜像命名带上了 导致
  • 海思3559A上编译libjpeg-turbo源码操作步骤

    1 从https github com libjpeg turbo libjpeg turbo releases tag 2 0 2 下载libjpeg turbo 2 0 2版本 2 脚本build sh内容如下 cmake DCMAKE
  • Redis五种数据结构及常用操作指令、Redis在JAVA中如何封装使用

    由于在博主的博客专栏 杂货铺实战 中的杂货铺项目中用到了Redis 那么本篇博文就针对Redis的五种数据结构以及如何在JAVA中封装使用做一个简单的介绍 文章目录 数据结构 string字符串 string字符串简介 string字符串在
  • nginx代理常见问题

    1 http200 但是返回We re sorry but XXXX doesn t work properly without JavaScript enabled Please enable it to continue 项目1 可能原
  • React.js 之筛选篇

    span style font size 14px 这个框架有听过好几次了 但自己没实现过 今天终于自己学了下 模仿写了这个过滤 妙味视频里面的 目前遇到的情况是用babel会丢失代码提示 但在浏览器中可视 划分组件 组件链接 span
  • 交叉熵损失函数优缺点_如何简单通俗的理解交叉熵损失函数?

    前面小编给大家简单介绍过损失函数 今天给大家继续分享交叉熵损失函数 直接来看干货吧 一 交叉熵损失函数概念 交叉熵损失函数CrossEntropy Loss 是分类问题中经常使用的一种损失函数 公式为 接下来了解一下交叉熵 交叉熵Cross
  • 多线程任务Rollback

    问题 多线程任务 一个任务执行错误 其他任务应该同步取消 1 主线程监视 主线程监视任务线程 当一个任务线程出现执行错误时 直接调用System exit 0 结束程序 任务线程代码 package com example thread c
  • 小程序服务器角色,小程序在我们的生活中扮演什么角色?

    原标题 小程序在我们的生活中扮演什么角色 我们给大家讲过关于小程序的相关问题 还有互联网 的相关问题 相信大家还不知道这两者之间的关系 今天我们给大家讲解一下关于小程序与互联网 的关联 我们再来回忆以下关于小程序的概念 对于用户来说 小程序
  • 应用角度看kafka的术语和功能

    kafka的术语 Terminology Topic 和Consumer Group Topic 每条发布到 Kafka 集群的消息都有一个类别 这个类别被称为 Topic 物理上不同 Topic 的消息分开存储 逻辑上一个 Topic 的
  • 入门必备小游戏之炸金花

    游戏的规则 一付扑克牌 去掉大小王 每个玩家发3张牌 最后比大小 看谁赢 牌型 豹子 三张一样的牌 如3张6 分值100 顺金 又称同花顺 即3张同样花色的顺子 如红桃 5 6 7 分值75 顺子 又称拖拉机 花色不同 但是顺子 如红桃5
  • 差分+差分矩阵(更适合新手宝宝体质)

    快速掌握差分以及差分矩阵 文章目录 快速掌握差分以及差分矩阵 前言 差分 差分的定义 官方解释 差分自定义 跟前缀和放在一起理解 差分数组的应用 题目描述 差分矩阵 与前缀和矩阵进行比较 差分矩阵定义 官方解释 自定义 修改操作 跟前缀和对