差分算法介绍

news2024/11/18 18:23:01

一、基本概念
差分算法是前缀和算法的逆运算,可以快速的对数组的某一区间进行计算操作。
例如,有一数列 a[1],a[2],.…a[n],且令 b[i] = a[i]-a[i-1],b[1]=a[1],那么就有
a[i] = b[1]+b[2]+.…+b[i] = a[1]+a[2]-a[1]+a[3]-a[2]+.…+a[i]-a[i-1],此时b数组称作a数组的差分数组
,换句话来说a数组就是b数组的前缀和数组 例:
原始数组a:9 3 6 2 6 8
差分数组b:9 -6 3 -4 4 2
可以看到a数组是b数组的前缀和数组。
在这里插入图片描述
知道了差分数组有什么用呢? 别着急,慢慢往下看。
话说有这么一个问题:
给定区间[l ,r ],让我们把a数组中的[ l, r]区间中的每一个数都加上c,即 a[l] + c , a[l+1] + c , a[l+2] + c , a[r] + c;
暴力做法是for循环l到r区间,时间复杂度O(n),如果我们需要对原数组执行m次这样的操作,时间复杂度就会变成O(n*m)。有没有更高效的做法吗? 考虑差分做法。

始终要记得,a数组是b数组的前缀和数组,比如对b数组的b[i]的修改,会影响到a数组中从a[i]及往后的每一个数。
首先让差分b数组中的 b[l] + c ,a数组变成 a[l] + c ,a[l+1] + c, a[n] + c;
然后我们打个补丁,b[r+1] - c, a数组变成 a[r+1] - c,a[r+2] - c,a[n] - c;
在这里插入图片描述

b[l] + c,效果使得a数组中 a[l]及以后的数都加上了c(红色部分),但我们只要求l到r区间加上c, 因此还需要执行 b[r+1] - c,让a数组中a[r+1]及往后的区间再减去c(绿色部分),这样对于a[r] 以后区间的数相当于没有发生改变。

那么现在有一个任务:对数组a区间[left,right]每个元素加一个常数c。这时可以利用原数组就是差分数组的前缀和这个特性,来解决这个问题。对于b数组,只需要执行

b[left] += c, b[right+1] −= c

如果知道a数组的大小,要求b数组,可以通过b[i] = a[i] - a[i-1]来求。也可以通过下面的insert函数还求。
可以这样看来,a数组一开始为全0数组,b数组是a的差分,然后a数组中一个数一个数的插入进来。对于第一个数a[1]的插入,就是在[1,1]的区间段加上a[1],而对b数组而言,就是b[1]+a[1],b[1+1]-a[1],即insert(1,1,a[1])

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

例题:

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

int n,m;
int a[N], b[N];

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);
    }
    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]);
}

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

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

相关文章

电脑开机密码忘记了怎么办?

相信很多朋友为了保护自己的隐私&#xff0c;都会在自己的电脑设置开机密码&#xff0c;但有时候电脑太久没用&#xff0c;就有可能忘记开机密码了&#xff0c;这可怎么办&#xff1f;别着急&#xff0c;今天就跟大家分享两种苹果电脑忘记开机密码解决方式&#xff0c;适用于Ma…

使用Junit进行单元测试的简单例子

首先新建一个工程&#xff0c;选择合适的路径和JDK版本&#xff0c;其它默认就行。 把Main.java内容改为如下。 后面就是对add方法增加单元测试 public class Main {public static void main(String[] args) {System.out.println("Hello world!");}public static i…

计算机网络——应用层协议原理

目录 1. 网络应用体系结构 1.1 客户机/服务器结构 1.2 P2P结构 1.3 混合结构 2. 进程通信 2.1 标识进程通信 2.2 套接字(socket) 3. 网络应用的服务需求 3.1 可靠数据传输 3.2 吞吐量 3.3 定时 3.4 安全性 3.5 常见网络应用的要求 4. 因特网提供的传输服务…

ArcGIS基础实验操作100例--实验69布局中添加报表和Excel图表

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验69 布局中添加报表和Excel图表 目录 一、实验背景 二、实验数据 三、实验步骤 &…

最快的表格:Dapfor Wpf GridControl

Dapfor Wpf GridControl 特性Wpf GridControl 是我们网格的第三个版本&#xff0c;它基于 WPF 技术。前两个产品是基于Microsoft WinForms 技术的MFC Grid 和.Net Grid。在网格的第三次迭代中&#xff0c;Dapfor 的专家采用了以前产品的最佳功能&#xff0c;从而产生了比其他供…

(4)go-micro微服务proto开发

文章目录一 Protobuf介绍二 安装Protobuf三 Protobuf语法1.1 基本规范1.2 字段规则1.3 service如何定义1.4 Message如何定义四 proto代码编写五 生成.go文件六 最后一 Protobuf介绍 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准&#xff0c;…

微信小程序开发笔记 基础篇③——自定义数据dataset,事件触发携带额外信息

文章目录一、前文二、视频演示三、原理和流程四、注意事项五、全部源码六、参考一、前文 想要实现一个电费充值界面。多个不同金额的充值按钮&#xff0c;每个按钮都携带自定义数据&#xff08;金额&#xff09;点击不同金额的充值按钮&#xff0c;就会上传对应的数据&#xf…

ssh无法登录Centos9解决方法

环境&#xff1a;Centos Stream release 9 情况&#xff1a;通过ssh方式&#xff0c;不管本地登录localhost还是远程登录&#xff0c;均失败。 尝试关闭firewalld和selinux&#xff0c;也不起作用。经搜索和尝试&#xff0c;需要修改/etc/ssh/sshd_config的PermitRootLogin的参…

Cpp20入门0:使用模块输出HelloWorld (import module)

时间&#xff1a;2023.1.8 视频地址&#xff1a;C20要不要学&#xff1f;&#xff1f;&#xff1f;_哔哩哔哩_bilibili 目录 一、Cpp20_HelloWorld ​编辑 头文件 Module.ixx 源文件 main函数 0.Cpp20_HelloWorld.cpp 二、Cpp20 main直接import 三、visual studio 快捷…

C语言银行管理系统

程序示例精选 C语言银行管理系统 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<C语言银行管理系统>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应…

指针进阶版☞(超easy~)

回顾初级指针&#xff1a;http://t.csdn.cn/5tCSr &#xff08;其中包含指针和指针数组&#xff09; 接下来的内容是进阶新知识点哟 (&#xff3e;&#xff35;&#xff3e;)ノ~&#xff39;&#xff2f;一.字符指针o(*&#xffe3;▽&#xffe3;*)ブ1.常量字符的指针。对于常…

STL-vector容器和string容器

目录 一、STL的基本概念 二、vector容器 1.遍历 2.vector存放自定义数据类型 3.容器嵌套容器 4.构造函数 5.容量和大小 6.插入和删除 7.容器互换 三、string容器 1.string和char的区别 2.string的构造函数 3.赋值操作 4.字符串拼接 5.查找和替换 6.比较 7.字符串的存取和单个字…

Linux应用编程---5.多线程的创建以及线程间数据共享

Linux应用编程—5.多线程的创建以及线程间数据共享 5.1 多线程的创建 ​ 创建多线程&#xff0c;则多次调用pthread_create()函数。创建两个线程&#xff0c;线程1每隔一秒打印字符串&#xff1a;Hello world&#xff01;&#xff0c;线程2每隔一秒打印字符串&#xff1a;Goo…

【目标检测】Casecade R-CNN论文讲解(超详细版本)

目录&#xff1a;Casecade R-CNN论文讲解一、背景二、简单回顾R-CNN结构2.1 Training阶段2.2 Inference阶段三、论文摘要四、介绍五、关于mismatch问题六、关于单纯增大训练时IoU阈值问题七、相关工作7.1 two-stage7.2 one-stage7.3 multi-stage八、Cascade R-CNN讲解九、总结论…

【NI Multisim 14.0原理图设计基础——元器件分类】

目录 序言 一、元器件分类 &#x1f349;1.电源库 &#x1f349;2.基本元器件库 &#x1f349;3.二极管库 &#x1f349; 4.晶体管库 &#x1f349;5.模拟元器件库 &#x1f349; 6.TTL库 &#x1f349;7.CMOS库 &#x1f349;8.其他数字元器件库 &#x1f349;9.混合…

白帽子VPS 选购指南

本文长期更新&#xff0c;用于记录价格便宜&#xff0c;可以支持个人代码审计测试/部署资产监控任务/hw临时使用等。因为国内云服务器的一些限制&#xff0c;所以文章推荐服务器均为国外服务器&#xff0c;且不需要进行实名认证 PS&#xff1a;不要进行未授权非法活动&#xf…

2、HDFS 入门

一、概述 ​ HDFS&#xff08;Hadoop Distributed File System&#xff09;是分布式文件存储系统&#xff0c;主要用来解决海量数据的存储问题。HDFS比较适合一次写入&#xff0c;多次读出的场景。 NameNode&#xff08;NN&#xff09; 管理HDFS的namespace维护副本策略管理Bl…

黑马学ElasticSearch(二)

目录&#xff1a; &#xff08;1&#xff09;初始ES-安装IK分词器 &#xff08;2&#xff09;IK分词器的拓展和停用词典 &#xff08;3&#xff09;操作索引库-mapping属性 &#xff08;4&#xff09;操作索引库-创建索引库 &#xff08;5&#xff09;操作索引库-查询-删除…

2023浙大MPA项目复试参考

今年浙大MPA项目复试是否会恢复线下面试呢&#xff1f;从形式上来说&#xff0c;常规批复试无论是采取钉钉线上还是现场&#xff0c;似乎都可以顺利完成这一项研究生录取前的必要环节。但在2021年浙大MBA和MPA两个项目顶着风险组织了一次现场面试&#xff0c;只不过是放在了西溪…

EEG-SEED数据集作者的---基线论文阅读和分析

《Investigating Critical Frequency Bands and Channels for EEG-based Emotion Recognition with Deep Neural Networks》 方法&#xff1a; A.预处理根据被试的反应&#xff0c;只选择诱发目标情绪的实验时期进行进一步分析。 将原始脑电图数据降采样至200Hz采样率。目视…