每周一算法:差分算法

news2024/9/24 1:23:33

差分算法

差分是一种常见的算法,用于快速修改数组中某一段区间的值。其基本思想就是预处理出数组的差分数组,然后修改区间时,只需要修改两个位置的值,即可快速完成区间修改。最后再通过差分数组求出原数组。差分算法在区间加、区间求和等问题中都有广泛的应用。

算法思想

  • 在原序列的基础上构造差分数组 d [ ] d[] d[],其中 d [ i ] d[i] d[i]表示序列中相邻两个元素之间的差值,即 d [ i ] = A [ i ] − A [ i − 1 ] d[i]=A[i]-A[i-1] d[i]=A[i]A[i1]。例如:对于序列 A = ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) A=(0,0,0,0,0,0,0,0,0,0) A=(0,0,0,0,0,0,0,0,0,0)的差分数组 d [ ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } d[]=\{0,0,0,0,0,0,0,0,0,0\} d[]={0,0,0,0,0,0,0,0,0,0}
    在这里插入图片描述

  • 在修改区间时,只需要更新差分数组两个位置上的值,即可快速完成修改。例如:给区间 [ L , R ] [L,R] [L,R]的元素加上 k k k,那么只需要将差分数组 d [ L ] + = k d[L] += k d[L]+=k d [ R + 1 ] − = k d[R + 1]-=k d[R+1]=k即可。例如:对序列 A A A的区间 [ 2 , 5 ] [2,5] [2,5]每个数增加 3 3 3,则将差分数组 d [ 2 ] + = 3 , d [ 6 ] − = 3 d[2]+=3,d[6]-=3 d[2]+=3,d[6]=3即可;对序列 A A A的区间 [ 1 , 7 ] [1,7] [1,7]每个数增加 2 2 2,则将差分数组 d [ 1 ] + = 2 , d [ 8 ] − = 2 d[1]+=2,d[8]-=2 d[1]+=2,d[8]=2即可;
    在这里插入图片描述

  • 最后,通过对差分数组计算前缀和来还原出更新之后的序列。
    在这里插入图片描述

时间复杂度

前缀和算法的时间复杂度分为两部分:

  • 对原序列的区间增加值: O ( 1 ) O(1) O(1)
  • 对差分数组求前缀和: O ( n ) O(n) O(n)

代码模板

//构造差分数组
void add(int L, int R, int k) 
{
	d[L] += k;
	d[R + 1] -= k;
}
//对差分数组求前缀和,还原序列
for(int i = 1; i <= n; i ++)
	d[i] += d[i - 1];

真题演练

题目链接:山东CSP-J2022 入门组1

有一排树苗,编号依次是 0 , 1 , 2 , . . . 0,1,2,... 012...。现有 n n n个志愿者去给树苗浇水,第 i i i个志愿者选定了一个区间 [ a i , b i ] [a_i,b_i] [aibi],表示第 i i i个志愿者将 [ a i , b i ] [a_i,b_i] [aibi]这一区间内的每一棵树都浇一次水。

如某个志愿者选择的浇水区间为 [ 4 , 9 ] [4,9] [49],表示他将给编号为 4 , 5 , 6 , 7 , 8 , 9 4,5,6,7,8,9 456789的树各浇水一次。

当所有的志愿者完成各自所选区间的浇水后,可能有些树苗被不同的志愿者浇力多次,也可能有的树苗一次也没被浇过水。

请你求出浇水最多的树苗被浇了多少次。

输入格式

第1行,一个整数 n n n,表示志愿者的人数。

第2行到第 n + 1 n+1 n+1行,每行两个整数 a , b i ( i = 0 , 1 , 2 , . . . n − 1 ) a_,b_i(i=0,1,2,...n-1) abii=012...n1,表示志愿者i选择的浇水区间。

输出格式

输出1行, 1 1 1个整数,表示浇水最多的树苗被浇水的次数。

样例输入

4
0 2
2 4
1 4
6 7

样例输出

3

提示

对于所有的数据: n < 1 0 5 n<10^5 n<105 0 < a < b < 1 0 6 0<a<b<10^6 0<a<b<106

解题思路

根据题目描述有 n n n个志愿者去给树苗浇水,每个志愿者将 [ a i , b i ] [a_i,b_i] [aibi]这一区间内的每一棵树都浇一次水,求浇水最多的树苗被浇了多少次。那么:

  • 可以用数组 d [ ] d[] d[]表示每个位置的浇水次数, d [ ] d[] d[]初始化为 0 0 0.
  • 每次对区间 [ L , R ] [L,R] [L,R]浇水时,将差分数组 d [ L ] + = 1 , d [ R + 1 ] − = 1 d[L] +=1,d[R + 1]-=1 d[L]+=1,d[R+1]=1
  • 最后对差分数组求前缀和得到每棵树苗的浇水次数,并求出其中的最大值。

代码实现

#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int d[N]; //差分数组
int main()
{
    int n, m = 0;
    scanf("%d", &n);
    for(int i = 1; i <= n; i ++)
    {
        int L, R;
        scanf("%d%d", &L, &R);
        d[L] += 1, d[R + 1] -= 1;
        m = max(m, R);
    }
    int ans = 0;
    for(int i = 0; i <= m; i ++)
    {
    	if(i > 0) d[i] += d[i - 1];
        ans = max(ans, d[i]);
    }
    cout << ans << endl;
}

总结

  • 差分算法可以快速修改序列中某一段连续区间的值。过程如下:
    • 在原序列的基础上构造差分数组
    • 给区间 [ L , R ] [L,R] [L,R]的元素加上 k k k,那么只需要将差分数组 d [ L ] + = k d[L] += k d[L]+=k d [ R + 1 ] − = k d[R + 1]-=k d[R+1]=k
    • 对差分数组计算前缀和来还原出更新之后的序列。
  • 除此之外,差分的思想还可以扩展到二位数组中。

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

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

相关文章

kafka安装及配置

1. 下载 下载地址&#xff1a;Apache Kafka 我这里下载的是 3.2.1 版本。 2. 上传并解压 上传到 linux 下的 /home/software/ 目录下&#xff0c;然后解压 kafka_2.13-3.2.1.tgz 包到/usr/local/ cd /home/software tar -zxvf kafka_2.13-3.2.1.tgz -C /usr/local # -C 选…

【机器学习】信息量、香农熵、信息增益(增加例子,方便理解)

这节可以搭配 【机器学习】Logistic回归&#xff08;重新整理&#xff09;信息量&#xff08;信息&#xff09;信息量公式的推理过程 香农熵信息增益 【机器学习】Logistic回归&#xff08;重新整理&#xff09; B站视频&#xff1a;“交叉熵”如何做损失函数&#xff1f;打包…

医学影像系统源码,三维后处理和重建 PACS源码

医学影像系统源码&#xff0c;三维后处理和重建 PACS源码 医学影像系统由PACS系统、RIS系统组成&#xff0c;提供与HIS的接口&#xff08;HL7或其他类型&#xff09;。 主要功能介绍 信息预约登记 支持对患者、检查项目、申请医生、申请单据、设备等信息进行管理。且支持检查…

Apache网站部署SSL证书开启https访问,强制http跳转https

centos服务器博客网站安装教程可见&#xff1a;Centos 7.X WordPress博客网站详细教程 FTP/PHP/mysql/Apache环境构建_autotian的博客-CSDN博客本文详细的介绍了centos7.x系统下&#xff0c;如何构建FTP、mysql、PHP、Apache环境&#xff0c;并成功安装WordPress博客网站。http…

Java—JDK8新特性—函数式接口【内含思维导图】

目录 3.函数式接口 思维导图 3.1 什么是函数式接口 3.2 functionalinterface注解 源码分析 3.3 Lambda表达式和函数式接口关系 3.4 使用函数式接口 3.5 内置函数式接口 四大核的函数式接口区别 3.5.1 Supplier 函数式接口源码分析 3.5.2 Supplier 函数式接口使用 3.…

基于AT89C51单片机的篮球计时记分设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87771065 源码获取 主要内容: 基于51单片机设计篮球计时计分器,结合单片机串行接口原理,用AT89C51设计一个篮球比赛计分计时器,能够通过数码管显示分数和比赛时间(并设有…

linux驱动-gpio

最近处理es8336声卡问题&#xff0c;最后排查是spk_ctl_gpio和hp_det_gpio这两个gpio导致的&#xff0c;所以恶补了一下gpio相关的知识&#xff0c;现在总结一下。 源代码使用的是飞腾的gitee上开源的内核&#xff1a;https://gitee.com/phytium_embedded/phytium-linux-kernel…

什么是SVG格式?如何制作?

图像质量对页面非常重要——扭曲和缩放变形的标志、图标或照片会使页面看起来粗糙和不协调&#xff0c;这个问题只会因为响应设计而复杂。 访问者通过桌面机和智能手机查看应用程序&#xff0c;因此无论使用什么设备&#xff0c;图像都应该进行优化。如果有一个数字格式可以让…

基于FPGA+JESD204B 时钟双通道 6.4GSPS 高速数据采集设计(三)连续多段触发存储及传输逻辑设计

本章将完成数据速率为 80MHz 、位宽为 12bits 的 80 路并行采样数据的连续多 段触发存储。首先&#xff0c;给出数据触发存储的整体框架及功能模块划分。然后&#xff0c;简介 MIG 用户接口、设置及读写时序。最后&#xff0c;进行数据跨时钟域模块设计&#xff0c;内存…

XC7VX690T PCIE 硬件设计注意事项

首先参考PG023找到对应封装支持的位置 然后参考UG476找到对应的实际物理位置 XILINX 也有给出对应的推荐位置

gitlab服务器发送邮件配置

1.修改gitlab的配置文件&#xff1a; vim /etc/gitlab/gitlab.rb 这里具体的gitlab.rb文件所在路径需要根据实际的来 找到如下图所示的部分&#xff0c;放开注释&#xff0c;修改配置&#xff0c;此处我用的发件邮箱是QQ邮箱&#xff0c;所以域名配置都是qq.com&#xff0c;…

Springboot application/yaml/yml没有提示解决方案

有下面提示别安装该插件 卸载wl spring assistant plugin就好了,标志是yml图标变成六边形

线程间互斥-mutex互斥锁和lock_guard

要点 锁双重判断的技法 竟态条件&#xff1a;多线程程序执行的结果一致&#xff0c;不会随着CPU对线程不同的调用顺序 线程间安全实例——3个窗口同时卖票 线程不安全的代码如下 int ticketCount 100; // 100张车票 // 模拟10个窗口同时卖票 void sellTicket(int index) …

PostgreSQL11 | 索引

截止到上一篇《PostgreSQL11 | 查询数据》属于pgsql的基础部分就算是都总结完了&#xff0c;从这一篇&#xff08;第9章&#xff09;开始一直到本专栏最后一篇文章&#xff08;第14章&#xff09;都是进阶部分&#xff0c;sql量会减弱&#xff0c;抽象的概念会越来越多&#xf…

数字识别问题

文章目录 6.1 MNIST数据处理6.2.1 训练数据6.2.2 变量管理6.3.1 保存模型6.3.1 加载计算图6.3.1 加载模型6.3.2 导出元图 6.1 MNIST数据处理 在直接在第6章的目录下面创建文件 compat.v1.是tensorflow2.x的语法&#xff0c;全部删掉 删除compat.v1.后的代码 # -*- coding: …

【SCI一区】考虑P2G和碳捕集设备的热电联供综合能源系统优化调度模型(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

学术必备的21个论文网站,建议收藏!

1、综合型论文网站&#xff08;国内&#xff09; &#xff08;1&#xff09;知网 介绍&#xff1a;国内知名度最高的网站&#xff0c;拥有上亿篇各种论文期刊&#xff0c;包含中国学术文献、 外文文献、学位论文、报纸、会议、年鉴、工具书等各类资源统一检索、统一导 航、…

第四章 图像的形态学操作

文章目录 前言一、阈值控制二、腐蚀与膨胀1.腐蚀2.膨胀3.形态学操作 总结 前言 前面讲解了图像基础理论、图像的变换以及图像滤波等操作&#xff0c;本章&#xff0c;将会介绍图像的形态学操作。 图像的形态学指的是一组数学方法和工具&#xff0c;用于图像分析和处理。形态学…

(7)Qt---文件IO

目录 1. QFileDialog 文件选择对话框** 2. QFileInfo 文件信息类** 3. QFile 文件读写类*** 4. UI与耗时操作** 5. QThread 线程类 5.1 复现阻塞 5.2 新建并启动子线程 5.3 异步刷新 5.4 停止线程 1. QFileDialog 文件选择对话框** 操作系统会提供一个统一样式的文件选择对话框…

从本地到云端:豆瓣如何使用 JuiceFS 实现统一的数据存储

豆瓣成立于 2005 年&#xff0c;是中国最早的社交网站之一。在 2009 到 2019 的十年间&#xff0c;豆瓣数据平台经历了几轮变迁&#xff0c;形成了 DPark Mesos MooseFS 的架构。 由机房全面上云的过程中&#xff0c;原有这套架构并不能很好的利用云的特性&#xff0c;豆瓣需…