一维差分思想【算法推导、深刻思考】

news2024/10/6 20:26:35

797. 差分 - AcWing题库

差分本质上就是前缀和的逆运算

算法推导

其实在最开始自己去完成这个题目的时候,感觉好像是可以往前缀和方向靠的,但是一下子没有想到实现方法就无疾而终了。所以最后选择的算法就只是单纯的暴力(虽然知道过不了,但是起码实现一下)

暴力代码

#include<iostream>

using namespace std;

const int N = 100008;

int a[N] , b[N];

int main(){
    int n , m;
    cin >> n >> m;
  
    for(int i = 1 ; i <= n ; i ++){
        cin >> a[i];
    }
  
    int l , r , c;
    while(m --){
        cin >> l >> r >> c;
      
        for(int i = l ; i <= r ; i ++){
            b[i] += c;
        }
    }
  
    for(int i = 1 ; i <= n ; i ++){
        cout << a[i] + b[i] << " ";
    }
    return 0;
}

这样子的话时间复杂度会花费

  • N个输入时间

  • 最多N * N个处理b[i]数组

    因为有m个处理请求(而m最大和N差不多

  • N个输出时间

所以这里的时间复杂度将是O(n^2^),必然是需要优化的

能处理哪里?

输入和输出的时间时不可避免的,唯一可以处理的就是如何更快速的完成[ l , r ]区间内加上c的操作

优化处理操作

我们可以构造一个数组b使得a [i] 是b的前缀和,那么b数组就称a数组的差分

也就是a[3] = b1 + b2 + b3

  • b1 = a1
  • b2 = a2 - a1
  • b3 = a3 - a2

所以,我们只需要求b数组的前缀和就能得到a[i]

若此时我们拥有B数组,那么只需要O(n)的时间就可以得到A(操作后的)

重新理解一下题意

题目要求我们对A数组[ l , r ]区间内,每一个都加上c。

即ai + c,ai+1 +c ,…,a~i + r - l~ + c

如果我们使用差分,我们可以使用O(1)的时间复杂度实现

因为A数组是B数组的前缀和,所以我们让Bleft + c后,那么Aleft 后面的每一位都将加上c

为什么呢?

因为A数组是B数组的前缀和(a2 = b2 + b1、a3 = b3 + b2 + b1),所以在Aleft之后,所有的值都将加上c

但是这样显然是不行的,因为我们只是需要在[ l , r ]上加上c,所以我们需要在某一个位置进行-r

在哪个位置呢?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UPCQBHRM-1681493494678)(assets/image-20230415004829-t6cqvl6.png)]

left开始的位置让数组都加上一个c

right + 1开始的位置后面都减去一个c

所以这里我们就可以用O(1)的时间复杂度处理数据了

代码模板

#include<iostream>

using namespace std;

const int N = 100008;

int a[N] , b[N];

void insert(int l , int r , int c){
    b[l] += c;
    b[r + 1] -= c;
}

int main(){
    int n , m ;
  
    cin >> n >> m ;
    for(int i = 1 ; i <= n ; i ++){
        cin >> a[i];
        insert(i , i , a[i]);
    }

    int l , r , c;
    while(m --){
        cin >> l >> r >>c;
      
        insert(l , r , c);
    }
  
    for(int i = 1 ; i <= n ; i ++){
        b[i] += b[i - 1];
        cout << b[i] << " ";
    }
    return 0;
}

其实,这里在代码中并没有很显然的表示 A,B两个数组

b[i] += b[i - 1];就是将B数组变成自己的前缀和——其实也就是我们上面推导公式所说的A数组(前缀和)

问题一:为什么要在输入的时候执行Insert操作?

其实要解释的就是为什么要执行b[r + 1] -= c;

我们可以完整的执行一遍操作理解,首先假设就是需要执行,我们模拟一遍

输入第一个数1,得到这样一个数组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1JVrYG0q-1681493494679)(assets/image-20230415011317-3qbvrvo.png)]

继续输入后,最后得到

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LUPiexp5-1681493494679)(assets/image-20230415011358-s0kjt0n.png)]

开始执行插入操作 [ 1 , 3 ]都需要 +1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sg2msXyb-1681493494679)(assets/image-20230415011634-08zw5f9.png)]

我们计算一下这个前缀和的结果

  • A1:(1+1)+0 = 2
  • A2:A1 + 1 = 3
  • A3:A2 + (-1) = 2

我们尝试带回原数组看看结果是否一致,处理1 2 2 1 2 1,在1~3的位置+1,结果就是2 3 2,结果是对的

为什么呢?

其实我们仔细去看之前的原始推导式就不能发现,我们是希望在[ l , r ]区间上都加上c,但是如果只在左侧加上,那么后面都会加上c,所以我们需要在r + 1-c才能保证结果一致

假设我就是不加,那意义是什么呢?

那就将导致从[ l , n ]都执行 +c操作,后面的数据将会越来越大(因为后面我们的输出是以前缀和形式输出的)

问题二:为什么要以前缀和的形式输出呢?也就是为什么要执行b[i] += b[i - 1];呢?

  • 因为在开始处理b数组时,我们有对b [ r + 1] 进行-c处理,就是为了保证以前缀和的形式输出!
  • 为了将[ l , r ]的处理以O(1)时间复杂度完成,而不是通过循环(这里就需要用到前缀和的思想,先将每一次的操作存起来,不修改原始数组,后面全部加起来就可以得到结果)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/410860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【操作系统复习】第5章 存储器管理

存储器的层次结构 存储层次 ➢ CPU寄存器 ➢ 主存&#xff1a;高速缓存、主存储器、磁盘缓存 ➢ 辅存&#xff1a;固定磁盘、可移动介质 层次越高&#xff0c;访问速度越快&#xff0c;价格也越高&#xff0c;存储容量也最小 寄存器和主存掉电后存储的信息不再存在&a…

2024软件工程考研之《软件工程导论》专业课复习

一、考察《软件工程导论》的学校 截止目前&#xff0c;考察《软件工程导论》的学校主要有&#xff1a; 大连理工大学887 北京航天航空大学991 北京交通大学901 河海大学846 海南大学835 新疆大学841 成都信息工程大学809 长安大学846 天津工业大学840 华东交通大学837 大连交通…

采购招投标系统-高效管控招采流程-降低采购成本

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…

软考证书找工作有用吗?软考找工作用处大吗

软考证书是衡量IT技术人才能力的一种重要评价标准。 一、软考高级证书对找工作的帮助 1. 竞争力增强 软考高级证书具有一定难度和较高的专业技能要求&#xff0c;拥有该证书的人的技术水平和专业能力会得到认可和尊重&#xff0c;从而增强求职者的竞争力。 2. 拓宽职业发展…

防火墙NAT实验,双机热备实验

目录 NAT防火墙基础实验 源地址转换 服务器映射 域内双向NAT 域间双向NAT 双机热备基础实验 主备备份 负载分担 NAT防火墙基础实验 实验拓扑&#xff1a; 1.进入防火墙图形化页面进行配置 接口列表的配置 源地址转换 企业内部网络访问外部网络&#xff0c;进行源地…

如何用nodejs构造一个网站爬虫

爬虫是个什么东西 英文spider&#xff0c;网络爬虫&#xff08;又称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者&#xff09;&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。另外一些…

干货分享 | 采购没“云”和有云的区别有哪些?

多年前&#xff0c;提起“云”这个词&#xff0c;很多人还是“不知所云”。 但如今&#xff0c;大众对“云”的了解和认可程度也越来越高&#xff0c;尽情享受着“云”带来的便利。 通过“云”&#xff0c;可以随时随地畅听海量音乐、进行网购、访问云盘的照片和视频、在云端创…

【数据分析】——分析方法

上司要你帮忙看看公司最近的网站运营情况怎么样&#xff1f; 公司最近的网站运营情况&#xff1f;这个问题太宽泛了&#xff0c;你得要知道上司的明确需求 问题1:boss,你是想看看公司网站具体哪方面的问题&#xff1f; 回答&#xff1a;公司最近销售不太好&#xff0c;订单转…

Kubernetes 多集群网络方案系列 1 -- Submariner 介绍

Submariner 是一个完全开源的项目&#xff0c;可以帮助我们在不同的 Kubernetes 集群之间&#xff08;无论是在本地还是云端&#xff09;实现网络通信。Submariner 有以下功能&#xff1a; 跨集群的 L3 连接跨集群的服务发现Globalnet 支持 CIDR 重叠提供命令行工具 subctl 简…

MappedByteBuffer 详解(图解+秒懂+史上最全)

背景&#xff1a; 在尼恩视频版本里&#xff0c;从架构师视角&#xff0c;尼恩为大家彻底介绍 rocketmq 高可用、高并发中间件的原理与实操。 给大家底层的解读清楚 rocketmq 架构设计、源码设计、工业级高可用实操&#xff0c;含好多复杂度非常高、又非常核心的概念&#xff…

Python 小型项目大全 11~15

十一、标题党生成器 原文&#xff1a;http://inventwithpython.com/bigbookpython/project11.html 我们的网站需要欺骗人们去看广告&#xff01;但是想出有创意的原创内容太难了。幸运的是&#xff0c;有了标题党生成器&#xff0c;我们可以让一台计算机产生数百万个令人发指的…

在CentOS 7.5上用离线压缩包安装Python-3.9.10的过程记录

项目的需要&#xff0c;需要在CentOS 7.5上去部署一个Python 3.9.10的安装环境。 值得注意的是在CentOS 7.5系统中&#xff0c;默认安装了 Python 2.7.x。 Python 2.7.x 是许多系统工具和应用程序所依赖的版本&#xff0c;因此它被包括在 CentOS 7.5 发行版中。如果在 CentOS …

太全面了,数据治理8大核心模块建设参考

数据治理是一个去中心化、多元参与的系统工程。一个全面且明确的数据治理体系&#xff0c;可以帮助组织构建生态式、协同化治理路径&#xff0c;最大化地提升整体数据质量&#xff0c;实现数据战略&#xff0c;激活新型生产力。 本文以元数据、数据标准、主数据、数据交换、数…

Mybatis-Plus批量添加或修改数据的三种方式

SpringBoot批量添加或修改数据的三种方式 方式一.Mybatis-plus 提供的 saveOrUpdateBatch 提供的方法 是遍历每一个元素&#xff0c;判断主键是否存在&#xff0c;如果存在则做更新&#xff0c;不存在添加 方式二.分组数据再批量添加或修改 先获取表中所有的主键 &#xff0…

6D姿态检测

3D相机—结构光相机 结构光&#xff0c;英文叫做 Structured light&#xff0c;其原理是基本原理是&#xff0c;通过近红外激光器&#xff0c;将具有一定结构特征的光线投射到被拍摄物体上&#xff0c;再由专门的红外摄像头进行采集。这种具备一定结构的光线&#xff0c;会因被…

如何在TikTok视频描述中提高用户参与度

鑫优尚电子商务&#xff1a;TikTok视频描述&#xff08;包括话题标签&#xff09;有150个字符的限制&#xff0c;因此卖家需要合理撰写出有趣且有实际意义的视频描述。可尝试将描述保持在140个字符以内&#xff0c;将最重要的信息放在前面&#xff0c;并通过多次修改文案以排除…

蚂蚁4.11笔试

文章目录前言一、红蓝格子填字母【蚂蚁4.11笔试第三题】解法一&#xff1a;二分解法解法二&#xff1a;模拟二、桌上弹球游戏【蚂蚁4.11笔试第二题】每日一题day82&#xff1a;困于环中的机器人&#xff08;力扣1041&#xff09;前言 1、红蓝格子填字母 2、桌上弹球游戏 3、困…

12 个好用且不花钱的网络监控工具

导读要让一个多级机构运行良好而且平稳的话&#xff0c;一个非常艰巨重大的任务就是做好网络管理。每个机构都配备专门的人员&#xff0c;即网络分析师&#xff0c;来进行网络管理。他们 使用了 许多工具来监视网络的运行状况&#xff0c;并查看网络流量的上升和下降状况。他们…

机器学习 03 K-近邻算法

目录 一、K-近邻算法 1.1 K-近邻算法(KNN)概念 1.1.1 概念理解举例 1.2 KNN算法流程总结 1.3 K值的选择 1.3.1 举例说明 1.4 kd树 1.4.1 KD树原理 1.4.2 树的建立 1.5 最近领域的搜索 k近邻算法优缺点 二、距离度量 2.1 距离公式的基本性质 2.2 常见的距离 2.2.…

进程间通信之消息队列

消息队列一. 什么是消息队列二. 消息队列有关函数1.获取key - ftok2.创建消息队列 - msgget3.发送消息 - msgsnd4.接收消息 - msgrcv5.删除消息队列 - msgctl三. 实例注意:一. 什么是消息队列 消息队列独立于发送消息的进程和接收消息的进程&#xff0c;消息队列是消息的链表&…