一维差分模板

news/2025/1/17 14:08:49/文章来源:https://www.cnblogs.com/xie-blog/p/18516823

一维差分模板

题目描述:

输入一个长度为 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

差分,可以看作对前缀和的逆运算,差分和前缀和类似于求导和积分的关系

首先我们有一个数组,a[0],a[1]........a[n-1],a[n]

然后我们可以构建另一个数组,b[0],b[1].........b[n-1],b[n]

将a数组看作是b数组的前缀和数组,也就是:a[i]=b[0]+......+b[i-1]+b[i]。

那么b数组就是a数组的差分数组。

如图所示:

image

知道了差分数组有什么用呢?让我们往后看。

回到题目,题目要求我们在区间[l,r]内的每个数都加上c,询问m次,我们正常的暴力做法是:

for(int i=l;i<=r;i++)
{a[i]+=c;
}

这个时间复杂度是O(n)的,但是我们可以用差分将这个时间复杂度优化到O(1).

我们要想到一点,a数组是b数组的前缀和数组,也就是对b数组的操作,会同样的影响到a数组。

首先,我们可以先让b[l]+c..........b[r]+c,

这样就给[l,r]内的数加上了c,

然后还没有结束,

我们还需要,b[r+1]-c..........b[n]-c

为什么要这样呢?

我们可以画图理解:

image

如果我们给b[l]+c,那么从l到n内的所有数都会+c,那我们该怎么做呢?

那我们只要给R+1到n内的所有数再减上c不就行了吗?

于是我们就得到了一维差分的核心代码:

b[l]+=c;
b[r+1]-=c;

完整代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N],b[N];  //a是原数组,b是差分数组 
int n,m;//差分操作 
void insert(int l,int r,int c)
{b[l]+=c;b[r+1]-=c;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=n;i++) insert(i,i,a[i]);     //构建差分数组 //询问 while(m--){int l,r,c;scanf("%d%d%d",&l,&r,&c);insert(l,r,c);  //[l,r]对每个数进行加c操作//O(1)的时间复杂度 }//将b数组还原为a数组 for(int i=1;i<=n;i++) a[i]=a[i-1]+b[i];for(int i=1;i<=n;i++) printf("%d ",a[i]);return 0;} 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计量经济学(十五)的理论基础——时间序列分解定理

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 时间序列分析是数据科学中的一个重要分支,旨在探索和理解随着时间变化的数据背后的模式和结构。无论是在金融市场预测、经济政策分析、环境监测还是医学研究…

程序员必备单品:超级常用的linux指令+实际操作案例

Linux常用命令 在Linux系统中,有许多常用的命令可以帮助用户进行文件管理、系统监控、网络配置等操作。以下是一些常见的Linux命令及其具体使用案例: ls:列出目录内容基本用法:ls [选项] [目录]常见参数:-a:显示所有文件,包括以.开头的隐藏文件。 -l:使用长列表格式显示…

数据采集第三次作业

代码链接:第三次数据采集实践作业码云链接 1 作业1 1.1 作业要求指定一个网站,爬取这个网站中的所有的所有图片,例如:中国气象网(http://www.weather.com.cn)。使用scrapy框架分别实现单线程和多线程的方式爬取。务必控制总页数(学号尾数2位)、总下载的图片数量(尾数后…

学习笔记(十五):ArkUi-切换按钮 (Toggle)

概述: 提供状态按钮样式、勾选框样式和开关样式,一般用于两种状态之间的切换 一、创建单选框 接口形式如下: type为类型,支持三种 1、Switch 不包含子组件Toggle({type:ToggleType.Switch,isOn:true}) 2、Checkbox 不包含子组件Toggle({type:ToggleType.Checkbox,isOn:tru…

二维前缀和模板

二维前缀和模板 题目描述: 输入一个 n 行 m 列的整数矩阵,再输入 q个询问,每个询问包含四个整数 x1,y1,x2,y2,表示一个子矩阵的左上角坐标和右下角坐标。 对于每个询问输出子矩阵中所有数的和。 输入格式: 第一行包含三个整数 n,m,q 接下来 n 行,每行包含 m 个整数,表示…

图文并茂教你如何发布自己的NPM包(GitHub Packages npm 包发布)

前情提要 发布包到npm也好,到github packages仓库也好,都是一样的道理,只是仓库地址不一样而已,本文是将npm包发布到了GitHub Packages~ GitHub Packages 简介 GitHub Packages 是一种软件包托管服务,和npm类似,允许您私下或公开托管软件包,并将包用作项目中的依赖项。 …

采用gpio-mio的sdk文档编译petalinux

其余步骤都ok 到下面生成boot.bin文件时失败 在网上找到了类似的 部署运行petalinux系统镜像_default bitsream is not found, please specify a bi-CSDN博客 经发现为该文件为纯PS端 未用到pl端 所以在生成时需要去除 --fpga 这样就成功了

redis中知识以及面试题

一、非关系型数据库NoSql 如下四种类型都是非关系型数据库 1.键值存储数据库(Key-Value) 如redis,就是键值存储数据库 2.列存储数据库 如clickhouse是列存储 3.文档型数据库 4.图形数据库(Graph) 二、redis的特点 redis是一个高性能的非关系型数据库,其中的所有数据形式都…

考研打卡(3)

开局(3) 开始时间 2024-10-30 21:38:56 结束时间 2024-10-30 22:27:21呜呜今天体侧了数据结构设一组初始记录关键字序列为(345,253,674,924,627),则用基数排序需要进行__躺 的分配和回收才能使得初始关键字序列变成有序序列。(武汉科技大学2014) A 3 B 4 C 5 D 8A 3答案…

学习笔记(十四):ArkUi-单选框 (Radio)

概述: 单选框组件,通常用于提供相应的用户交互选择项,同一组的Radio中只有一个可以被选中。 单选框组件不支持自定义样式 一、创建单选框 接口形式如下: value 为单选框名称,group为单选框所在组的名称,同一个组内最多只有一个单选框为选中状态Radio(options: {value: st…

【专题】2023-2024中国保险数字化营销调研报告汇总PDF洞察(附原数据表)

原文链接: https://tecdat.cn/?p=38063 在时代浪潮的推动下,中国保险行业正经历着一场波澜壮阔的变革之旅。 2023 年,中国经济迈向高质量发展阶段,保险公司纷纷聚焦队伍转型,专业化、职业化代理人成为行业新方向。回顾保险代理人队伍发展,历经多次变革,从早期扩张到面临…

2024CCPC哈尔滨部分题解

赛时被评测机卡死了 M.奇怪的上取整求\(\sum_{i=1}^{n} f(n,i)\) \(Input\) 第一行一个整数\(T(1<=T<=10^3)\),表示数据组数 对于每组数据,一行一个整数\(n(1<=n<=10^9)\) \(Output\) 对于每组数据,输出一行一个整数,表示答案。 \(Sample\) 3 5 451 114514 ——…