洛谷 P3406 海底高铁 题解 差分数组 前缀和

前缀和+差分+倍增例题 GoACwing795 前缀和ACwing 797 差分洛谷P3406 海底高铁 ACwing795 前缀和 题目描述 输入一个长度为n的整数序列。 接下来再输入m个询问,每个询问输入一对l, r。 对于每个询问,输出原序列中从第l个数到第r个数的和。 输入格式 第一行包含两个整数n和m。 第二行包含n个整数,表示整数数列。 接下来m行,每行包含两个整数l和r,表示一个询问的区间范围。 输出格式 共m行,每行输出一个询问的结果。 数据范围 1≤l≤r≤n, 1≤n,m≤100000, −1000≤数列中元 阅读详情

海底高铁

题目描述

该铁路经过 N N N 个城市,每个城市都有一个站。不过,由于各个城市之间不能协调好,于是乘车每经过两个相邻的城市之间(方向不限),必须单独购买这一小段的车票。第 i i i 段铁路连接了城市 i i i 和城市 i + 1 ( 1 ≤ i < N ) i+1(1\leq i<N) i+1(1≤i<N)。如果搭乘的比较远,需要购买多张车票。第 i i i 段铁路购买纸质单程票需要 A i A_i Ai​ 博艾元。

虽然一些事情没有协调好,各段铁路公司也为了方便乘客,推出了 IC 卡。对于第 i i i 段铁路,需要花 C i C_i Ci​ 博艾元的工本费购买一张 IC 卡,然后乘坐这段铁路一次就只要扣 B i ( B i < A i ) B_i(B_i<A_i) Bi​(Bi​<Ai​) 元。IC 卡可以提前购买,有钱就可以从网上买得到,而不需要亲自去对应的城市购买。工本费不能退,也不能购买车票。每张卡都可以充值任意数额。对于第 i i i 段铁路的 IC 卡,无法乘坐别的铁路的车。

Uim 现在需要出差,要去 M M M 个城市,从城市 P 1 P_1 P1​ 出发分别按照 P 1 , P 2 , P 3 , ⋯   , P M P_1,P_2,P_3,\cdots,P_M P1​,P2​,P3​,⋯,PM​ 的顺序访问各个城市,可能会多次访问一个城市,且相邻访问的城市位置不一定相邻,而且不会是同一个城市。

现在他希望知道,出差结束后,至少会花掉多少的钱,包括购买纸质车票、买卡和充值的总费用。

输入格式

第一行两个整数, N , M N,M N,M。

接下来一行, M M M 个数字,表示 P i P_i Pi​。

接下来 N − 1 N-1 N−1 行,表示第 i i i 段铁路的 A i , B i , C i A_i,B_i,C_i Ai​,Bi​,Ci​。

输出格式

一个整数,表示最少花费

样例 #1

样例输入 #1

9 10
3 1 4 1 5 9 2 6 5 3
200 100 50
300 299 100
500 200 500
345 234 123
100 50 100
600 100 1
450 400 80
2 1 10

样例输出 #1

6394

提示

2 2 2 到 3 3 3 以及 8 8 8 到 9 9 9 买票,其余买卡。

对于 30 % 30\% 30% 数据 M = 2 M=2 M=2。

对于另外 30 % 30\% 30% 数据 N ≤ 1000 , M ≤ 1000 N\leq1000,M\leq1000 N≤1000,M≤1000。

对于 100 % 100\% 100% 的数据 M , N ≤ 1 0 5 , A i , B i , C i ≤ 1 0 5 M,N\leq 10^5,A_i,B_i,C_i\le10^5 M,N≤105,Ai​,Bi​,Ci​≤105。

原题链接

洛谷P3406——传送门

思路

1.利用 差分数组+前缀和 求出经过第 i 段铁路的次数:
cnt[i] = cnt[i-1]+d[i]
2.利用 贪心思想 求出在第 i 段铁路上花费的总费用:
change[i] = min(cnt[i]*a[i],cnt[i]*b[i]+c[i])

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int n, m;
    cin >> n >> m;
    vector<int> p(m);
    for (int i = 0; i < m; i++)
    {
        cin >> p[i];
    }
    vector<int> a(n), b(n), c(n); // 第i个表示城市i和城市i+1之间的费用
    for (int i = 1; i < n; i++)
    {
        cin >> a[i] >> b[i] >> c[i];
    }
    vector<int> d(n + 1); // 差分数组
    vector<int> cnt(n);   // 经过第i段铁路的次数

    for (int i = 0; i < m - 1; i++)
    {
        int st = min(p[i], p[i + 1]); // 起点
        int ed = max(p[i], p[i + 1]); // 终点
        d[st]++;
        d[ed]--;
        // 在cnt数组中区间[l,r)里的每个数加1,相当于在差分数组中d[l]++,d[r]--
    }

    cnt[0] = 0; // 初始化cnt[0],便于根据差分数组求前缀和
    for (int i = 1; i < n; i++)
    {
        cnt[i] = cnt[i - 1] + d[i]; // 求前缀和,即为经过第i段铁路的次数
    }

    ll ans = 0; // 费用和

    for (int i = 1; i < n; i++)
    {
        ans += min(1ll * a[i] * cnt[i], 1ll * b[i] * cnt[i] + c[i]); // 贪心,取两种方案的最小值(费用和次数相乘会爆int,记得乘1ll)
    }

    cout << ans << '\n';

    return 0;
}
洛谷p3406海底高铁(前缀和差分思想) 分析题意,首先,若要从1到达5城市,只能由1-2-3-4-5这样的方式乘坐,而从5到3也只能5-4-3来乘坐,这也就代表着,每一次到达一个城市都得经历他们路上的每一个城市。而这个次数值一定是和我们的选择有关的,这一点想必不用多说。答案也不难想到,利用贪心策略,让每一次每一个城市的价钱都最小,即次数*价钱的最小值,代码也就不难想到了。很简单,我们从上述题意中分析到要让某个区间内的数字全部加上,减上某个值,那么来吧!买一张c的卡,享受b的价钱,但有一些数据他是a小于后面的值的,或者有时只经过一次时用a更省钱。 阅读详情

相关推荐

备战蓝桥杯,用JAVA刷洛谷算法题单:【算法2-1】前缀和、差分与离散化

备战蓝桥杯,用JAVA刷洛谷算法题单:【算法2-1】前缀和、差分与离散化

Miss_ReRia 1810

【洛谷 P3406】海底高铁 题解(差分+前缀和+贪心算法)

该铁路经过N个城市,每个城市都有一个站。不过,由于各个城市之间不能协调好,于是乘车每经过两个相邻的城市之间(方向不限),必须单独购买这一小段的车票。第i段铁路连接了城市i和城市i11≤iN。如果搭乘的比较远,需要购买多张车票。第i段铁路购买纸质单程票需要Ai​博艾元。虽然一些事情没有协调好,各段铁路公司也为了方便乘客,推出了 IC 卡。对于第i段铁路,需要花Ci​博艾元的工本费购买一张 IC 卡,然后乘坐这段铁路一次就只要扣Bi​Bi​Ai​元。

HEX9CF的技术博客 1568

题解:洛谷 P3406 海底高铁

IC 卡可以提前购买,有钱就可以从网上买得到,而不需要亲自去对应的城市购买。个城市,每个城市都有一个站。不过,由于各个城市之间不能协调好,于是乘车每经过两个相邻的城市之间(方向不限),必须单独购买这一小段的车票。的顺序访问各个城市,可能会多次访问一个城市,且相邻访问的城市位置不一定相邻,而且不会是同一个城市。现在他希望知道,出差结束后,至少会花掉多少的钱,包括购买纸质车票、买卡和充值的总费用。虽然一些事情没有协调好,各段铁路公司也为了方便乘客,推出了 IC 卡。段铁路的 IC 卡,无法乘坐别的铁路的车。

团爸讲算法 1122

洛谷P3406 海底高铁

思路:利用前缀和计算出每段路要走的次数,根据次数分别计算这段路选ic卡的费用和直接买票的费用,选择花费少的。注意点:每次操作将a[i]到a[i+1]之间的路的通过次数都加1,需判断a[i]和a[i+1]的大小。

m0_67286481的博客 756

Docker 与容器技术的未来:从 OCI 标准到 eBPF 的演进

OCI 的核心目标是创建一个开放的、厂商中立的容器技术标准。这意味着,只要一个容器镜像符合 OCI 镜像格式规范,它就可以在任何符合 OCI 运行时规范的容器运行时上运行。eBPF 是一种革命性的技术,它允许在 Linux 内核中安全地运行沙盒程序,而无需修改内核源代码或加载内核模块。这些程序可以注册到内核中的各种事件点(如网络包到达、系统调用、函数调用/返回),并在事件发生时执行自定义逻辑。核心思想是:在不将数据复制到用户空间的情况下,程序可以直接在内核中处理数据,极大地提高了效率和性能。

专栏 1382

人形机器人人机交互解决方案(2026完整版)

《人形机器人人机交互解决方案(2026完整版)》摘要 本项目针对2026年人形机器人产业爆发式增长需求,提出了一套完整的人机交互解决方案。方案包含十大核心模块(语音识别、情感识别、手势识别等),采用五层架构设计,实现多模态融合交互,响应时间≤32ms,准确率≥99%。覆盖制造业巡检、家庭服务等10大场景,适配20+主流机型。项目总投资4.1亿元,预期年营收8.2亿元,将申请专利120项,培养专业人才300人。通过技术创新解决当前交互体验生硬、安全可控性不足等痛点,助力我国人形机器人产业实现从"跟跑

随读手记 775

洛谷:海底高铁(P3406)C++

洛谷海底高铁c++详解版

weixin_73060900的博客 1150

dbt+Snowflake实战:数据建模、权限隔离与性能优化全指南

dbt(data build tool)作为现代数据栈的核心建模工具,其与Snowflake的深度协同远不止于SQL编译执行——它本质是将软件工程实践(如版本控制、测试驱动、CI/CD)注入数据交付流程。理解dbt的声明式建模原理与Snowflake的虚拟仓库、Time Travel、TRANSIENT表、聚簇键等底层机制如何咬合,是实现可维护、可审计、低成本数据产品交付的关键。本文聚焦dbt在Snowflake环境中的真实落地挑战,涵盖schema与warehouse的物理映射设计、role级硬隔离策略、

weixin_34389926的博客 312

洛谷 P3406 海底高铁

P3406 海底高铁

qq_63052321的博客 426

逆向工程师视角:拆解DataDome滑块验证码的3层防护机制与绕过思路

本文从逆向工程师视角,深入剖析DataDome滑块验证码的三层核心防护机制。第一层通过动态加密参数实现会话绑定与抗重放;第二层采集TLS指纹、鼠标轨迹动力学等多维行为数据进行一致性验证;第三层则是基于机器学习的后端异步风险决策引擎。文章不仅拆解了其技术原理,更分享了模拟、钩取等超越单纯工具调用的底层分析与绕过思路。

f6g7h8i9j的博客 730

从封装到先进封装:一文讲透Chiplet、2.5D/3D堆叠与系统集成

封装是芯片产业链中连接硅片与电路板的桥梁,承担物理保护、电气连接、散热与机械支撑等核心任务。传统封装从DIP、QFP发展到BGA,通过提升引脚密度满足早期性能需求。随着摩尔定律放缓,单纯缩小晶体管尺寸难以为继,先进封装应运而生,其核心理念从“封装单颗芯片”转向“系统级高密度集成”。扇出型封装、2.5D硅中介层、3D堆叠、Chiplet和系统级封装等技术,通过微米级互连和垂直堆叠,大幅提升I/O密度与带宽,成为AI芯片、HBM存储、高性能计算等领域的关键支撑。本文梳理先进封装的技术演进、分层架构与工程难点,帮

weixin_29185167的博客 366

洛谷P3406 海底高铁(前缀和&差分)Java题解

IC 卡可以提前购买,有钱就可以从网上买得到,而不需要亲自去对应的城市购买。不过,由于各个城市之间不能协调好,于是乘车每经过两个相邻的城市之间(方向不限),必须单独购买这一小段的车票。求出差分数组后,再求得前缀和数组即是每段路要经过的次数,最后再比较买卡费用少还是买票费用小,贪心求取即可。的顺序访问各个城市,可能会多次访问一个城市,且相邻访问的城市位置不一定相邻,而且不会是同一个城市。现在他希望知道,出差结束后,至少会花掉多少的钱,包括购买纸质车票、买卡和充值的总费用。如果搭乘的比较远,需要购买多张车票。

m0_71209625的博客 1985

Gromacs 模拟昆虫 P450 解毒酶与农药结合完整指南,仅供参考!

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1239

【前缀和与差分 C/C++】洛谷 P3406 海底高铁

【前缀和与差分 C/C++】洛谷 P3406 海底高铁

仟墨(郑龙浩)的博客 1138

TC397 EB MCAL开发从0开始系列 之 [13.1] Dma配置实战 -实现M2M数据传输(读存储写存储)

TC3XX TC397 MCAL DMA 从0搭建测试用例-实现M2M 存储到存储数据传输

yy九歌的博客 1913

游戏客户端开发工程师笔试题

1、已知有一个关键字序列:(27,23,34,14,1,55, 20,19,85,83,10,68)散列存储在一个哈希表中,若散列函数为H(key)=key%7,并采用链地址法来解决冲突,则在等概率情况下查找成功的平均查找长度为(4、出现死锁时,除了可以采用资源剥夺的方法解决死锁问题外,还可以使用的方法是()是被限定只能在表的一端进行插入运算,在另一端进行删除运算的线性表.5、大端模式,是指数据的高字节保存在内存的(3、在二叉查找树中, 最好情况下复杂度为。)地址中,而数据的低字节保存在内存的(

博客 1870

洛谷 P3406 海底高铁(详解)c++

看输入输出案例,上图有9个车站,每个车站之间都有一个铁路,要经过10个城市,分别是先从3到1,1到4,4到1,依此类推,从3到1不会直接从3顺移到1,是从3到2,再到1,所以从1到3之间,这一段铁路全都是需要乘坐一次的,接下来从1到4,是1先到2乘坐一次,2到3乘坐一次,3到4乘坐一次,4到1也是同理,接下来的数据表示的是每段铁路的abc的值,第一条铁路有属于它的abc,第二条铁路也是,最终我们要计算在它这样的行程里最小花费是多少就可以了。1:从2到3需要购买一份车票,从3到2也要购买一份车票。

weixin_73266891的博客 1190

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

差分数组_洛谷P3406 海底高铁

假设我们有一个原始数组arr,其差分数组diff定义为:通过差分数组可以快速恢复原始数组:2. 核心操作:区间更新当需要对原始数组arr的区间[l, r]中的每个元素增加val时:原理: 当计算前缀和时,diff[l]的增量会影响从l到末尾的所有元素,而diff[r+1]的减量会抵消超过r的部分,从而实现区间[l, r]的精准更新。3. 恢复原始数组通过前缀和数组可以将差分数组还原为原始数组题目大意是说,Uim 要按照给定的顺序访问 M 个城市,每次移动会经过多个铁路段。

2401_87918616的博客 627

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

洛谷-P3406 海底高铁:差分和前缀和

该铁路经过N个城市,每个城市都有一个站。不过,由于各个城市之间不能协调好,于是乘车每经过两个相邻的城市之间(方向不限),必须单独购买这一小段的车票。第i段铁路连接了城市i和城市i+11≤i

qq_63268519的博客 362

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

差分算法 cpp

差分算法通过预处理优化区间修改操作,将时间复杂度从O(n)降至O(1)。一维差分通过构造差值数组,利用f[L]+=k和f[R+1]-=k实现区间快速加减。海底高铁问题应用差分统计各路段乘车次数,再比较买票和购卡成本求得最小花费。典型空间换时间策略,需注意操作完成后才能还原数组。差分与前缀和互为逆运算,是优化暴力枚举的有效方法。

2502_93161594的博客 377

用于枚举优化的差分和前缀和

用于优化枚举的差分、前缀和

m0_73693552的博客 841

5.差分+前缀和(一个区域整体添加一个数)

最后利用前缀和完善数组。

WG_17的博客 388

《算法竞赛从入门到国奖》算法基础:入门篇-差分

本文介绍了差分算法及其应用场景。差分数组通过存储相邻元素的差值,能够高效处理区间增减操作,将O(n)时间复杂度优化为O(1)。文章详细讲解了一维差分和二维差分的实现原理:一维差分只需修改区间两端点,二维差分则需要修改四个边界点。通过三个例题(模板差分、海底高铁、地毯问题)展示了差分算法的实际应用,包括代码实现。差分算法本质是空间换时间的预处理方法,与前缀和互为逆运算,特别适合处理大量区间统一增减操作的需求。

qq_49648783的博客 1052

蓝桥杯每日一题----海底高铁

其实解题思路蛮简单的,我们只要找到每个城市去的次数,再加上每段路程最小的花费,就是总的最小的花费。在这道题来说,主要使用的想法就是使用一维的差分数组,这道题中有两个买票的策略。比如说,从1,3,那么可以设为1为L,3为R。K为1,当中的路径每个+1.一种是,直接买票,另外一种是买IC卡并买带有优惠的票。而我们在获取每段路程的次数上,就可以使用差分的方式。好了,今天的内容就到这里,我们明天再见。P3406 海底高铁 - 洛谷。

in_seattle的博客 580

洛谷P3406--海底高铁

该铁路经过N个城市,每个城市都有一个站。不过,由于各个城市之间不能协调好,于是乘车每经过两个相邻的城市之间(方向不限),必须单独购买这一小段的车票。第i段铁路连接了城市i和城市i11≤iN。如果搭乘的比较远,需要购买多张车票。第i段铁路购买纸质单程票需要Ai​博艾元。虽然一些事情没有协调好,各段铁路公司也为了方便乘客,推出了 IC 卡。对于第i段铁路,需要花Ci​博艾元的工本费购买一张 IC 卡,然后乘坐这段铁路一次就只要扣Bi​Bi​Ai​元。

没有标题哈哈哈 136
上一篇: 洛谷 T439063 签到题 状压dp
下一篇: 洛谷 P3901 数列找不同 题解 莫队
bbc_ouo
博客等级 码龄3年 2096粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值