【算法通关指南:算法基础篇】一维差分专题:1.【模板】差分 2.海底高铁

【算法通关指南:算法基础篇】一维差分专题:1.【模板】差分 2.海底高铁
在这里插入图片描述
🔥小龙报:个人主页
🎬作者简介:C++研发,嵌入式,机器人方向学习者
❄️个人专栏:《算法通关指南》
永远相信美好的事情即将发生
在这里插入图片描述

文章目录


前言

本专栏聚焦算法题实战,系统讲解算法模块:以《c++编程》,《数据结构和算法》《基础算法》《算法实战》 等几个板块以题带点,讲解思路与代码实现,帮助大家快速提升代码能力
ps:本章节题目分两部分,比较基础笔者只附上代码供大家参考,其他的笔者会附上自己的思考和讲解,希望和大家一起努力见证自己的算法成长

一、差分

前缀和与差分的核心思想是预处理,可以在暴力枚举的过程中,快速给出查询的结果,从而优化时间复杂度,是经典的用空间替换时间的做法。
本质前缀和与差分是⼀对互逆的运算

二、一维差分

2.1 差分数组构建方式

根据定义f[i]=a[i]−a[i−1]
根据差分数组的性质f[i] += a[i], f[i+1] −= a[i]

在这里插入图片描述

2.2 根据差分数组的性质处理区间修改

核心公式f[L] + = c, f[R+1] − = c

在这里插入图片描述

2.3 还原数组

对差分数组做⼀次「前缀和」,就可以还原出原数组

在这里插入图片描述

三、一维差分经典算法题

3.1【模板】差分

3.1.1题目

链接:【模板】差分

在这里插入图片描述

3.1.2 算法原理

依照刚才讲解一维差分原理模拟即可

3.1.3代码

3.1.3.1 根据差分数组的性质

#include<iostream> using namespace std;constint N =1e5+10;int n, m;int f[N];intmain(){ cin >> n >> m;for(int i =1; i <= n; i++){int x; cin >> x; f[i]+= x; f[i +1]-= x;}while(m--){int l, r, k; cin >> l >> r >> k; f[l]+= k; f[r +1]-= k;}for(int i =1; i <= n; i++){ f[i]+= f[i -1]; cout << f[i]<<" ";}return0;}

3.1.3.2 根据定义

#include<iostream> using namespace std;constint N =1e5+10;int n, m;int f[N];int a[N];intmain(){ cin >> n >> m;for(int i =1; i <= n; i++) cin >> a[i];for(int i =1; i <= n; i++) f[i]= a[i]- a[i -1];while(m--){int l, r, k; cin >> l >> r >> k; f[l]+= k; f[r +1]-= k;}for(int i =1; i <= n; i++){ f[i]+= f[i -1]; cout << f[i]<<" ";}return0;}

3.2 海底高铁

3.2.1题目

链接:海底高铁

在这里插入图片描述

3.2.2 算法原理

1.先考虑如何让花费最小,想要求最小花费,需要知道每⼀段高铁被「乘坐了多少次」,记作f[i],那么最小花费就是「买票的花费」与「买卡的花费」两者之间的最小值:f[i]
(1)买票花费:;a[i]×f[i]
(2)买卡花费,乘车花费+工本费:b[i]×f[i]+c[i]
(3)那么最小花费就是:mincost=min(a[i]×f[i], b[i]×f[i]+c[i])
2.接下来考虑如何求出每⼀段⾼铁被「乘坐了多少次」。根据访问城市的序列p1 ,p2 ,p3 ,…,pm 可知,对于任意⼀次访问 pi∼p ,我们会乘坐[pi ~ pi + 1 - 1]之间所有的高铁,比如p =i 3, pi+1 = 6,那么[3,5]之间所有的高铁都会被乘坐⼀次,相当于每个数都加上1,「注意6位置不会乘坐到」。那么我们就可以利用「差分数组」
(1)创建⼀个全为0的差分数组;
(2)遍历访问序列,对于每⼀次访问f[p]+ i +, f[p]− i+1 −
(3)然后对差分数组做⼀次前缀和,就得到每个⾼铁乘坐的次数
注意城市访问的序列有可能pi > pi + 1,此时应该「交换」⼀下顺序

3.2.3代码

#include<iostream> using namespace std;constint N =1e5+10;typedeflonglong LL; LL f[N];intmain(){ LL n, m; cin >> n >> m; LL x; cin >> x;for(int i =2; i <= m; i++){ LL y; cin >> y;// x -> yif(y > x){ f[x]++; f[y]--;}// y -> xelse{ f[x]--; f[y]++;} x = y;}for(int i =1; i < n; i++) f[i]+= f[i -1]; LL ret =0;for(int i =1; i < n; i++){ LL a, b, c; cin >> a >> b >> c; ret +=min(a * f[i], c + b * f[i]);} cout << ret << endl;return0;

}

总结与每日励志

摘要: 本文介绍了差分算法的基本原理及其应用,重点讲解了一维差分的构建方式、区间修改处理及数组还原方法。通过经典算法题如【模板】差分和海底高铁问题,展示了差分在优化时间复杂度中的实际应用。文章还提供了详细的代码实现,帮助读者快速掌握差分算法。最后以励志语句“永远相信美好的事情即将发生”鼓励读者坚持学习与成长。 关键词: 差分算法、前缀和、区间修改、时间复杂度、算法实战

在这里插入图片描述

Read more

MySQL面试题合集!

MySQL面试题合集!

* 临近秋招,备战暑期实习,祝大家每天进步亿点点!Day13 * 本篇总结的是 MySQL 相关的面试题,后续会每日更新~ 一、MySQL索引分析以及相关面试题 * 参考文章:MySQL索引分析以及相关面试题 二、MySQL主从复制与表拆分相关问题总结 * 参考文章: MySQL主从复制与表拆分相关问题总结 三、MySQL如何解决幻读和不可重复度? * 参考文章:MySQL如何解决幻读和不可重复度? 四、MySQL中联表查询条件WHERE和ON的区别? * 参考文章:MySQL中联表查询条件WHERE和ON的区别? 五、MySQL基础知识相关面试题总结 * 参考文章:MySQL基础知识相关面试题总结 六、MySQL锁相关问题学习 * 参考文章:MySQL锁相关问题学习 最后再安利一篇mysql面试题合集: https://blog.ZEEKLOG.net/v123411739/article/details/106893197 总结的面试题也挺费时间的,文章会不定时更新,有时候一天多更新几篇,如果帮助您复习巩固了知识点,还请三连支

By Ne0inhk
我的世界Java下载——MC启动的基石【2025年MC下的Java下载配置教程】

我的世界Java下载——MC启动的基石【2025年MC下的Java下载配置教程】

一、从Mc的角度简述Java     ·游戏本体就是 Java 写的:Notch 最早用 Java 开发 MC,使其天然跨平台,PC、Mac、Linux 都能玩。     ·模组生态靠 Java:Forge、Fabric 等 API 和无数 Mod 都是 Java 字节码;玩家拖进 mods 文件夹就能被 JVM 动态加载,无需重新编译游戏。     ·插件与服务端同理:Bukkit、Spigot、Paper 等服务器核心也是 Java 程序,插件 jar 直接热插拔,让小游戏、 经济、地皮等功能即刻生效。     ·启动器只是“入口”:PCL2、HMCL、官方启动器都负责下载

By Ne0inhk

Java 单元测试自动化:手把手教你用 Claude Skills 生成高质量测试代码

Java 单元测试自动化:手把手教你用 Claude Skills 生成高质量测试代码 * 前言 * 一、什么是 Claude Skills? * 1.1 核心概念 * 1.2 为什么需要 Skill? * 二、创建 Java 单元测试 Skill * 2.1 准备工作 * 2.2 编写 SKILL.md * YAML 元数据 * 主体内容结构 * 2.3 核心:触发条件与前置检查 * 触发条件定义 * 前置检查清单 * 三、测试代码生成规范详解 * 3.1 测试类命名规范 * 3.2 导入声明规范 * 3.3

By Ne0inhk
Java:二维数组

Java:二维数组

目录 1. 二维数组的基础格式 1.1 二维数组变量的创建 —— 3种形式 1.2 二维数组的初始化 \1 动态初始化 \2 静态初始化 2. 二维数组的大小 和 内存分配 3. 二维数组的不规则初始化 4. 遍历二维数组 4.1 for循环 编辑 4.2 for-each循环 5. 二维数组 与 方法 5.1 二维数组的数据类型 5.2 二维数组作为方法参数 5.3 二维数组作为返回值 6. 二维数组转字符串deepToString 1. 二维数组的基础格式 1.1 二维数组变量的创建 —— 3种形式

By Ne0inhk