当前位置: 首页 > news >正文

csp信奥赛C++高频考点专项训练之前缀和差分 --【一维差分】:海底高铁

csp信奥赛C++高频考点专项训练之前缀和&差分 --【一维差分】:海底高铁

题目描述

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

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

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

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

输入格式

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

接下来一行,M MM个数字,表示P i P_iPi

接下来N − 1 N-1N1行,表示第i ii段铁路的A i , B i , C i A_i,B_i,C_iAi,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 223 33以及8 889 99买票,其余买卡。

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

对于另外30 % 30\%30%数据N ≤ 1000 N\leq1000N1000M ≤ 1000 M\leq1000M1000

对于100 % 100\%100%的数据M , N ≤ 10 5 M,N\leq 10^5M,N105A i , B i , C i ≤ 10 5 A_i,B_i,C_i\le10^5Ai,Bi,Ci105

思路分析

题目要求计算在给定行程下,为每一段铁路选择购卡或单程票的最小总花费。
关键步骤:

  1. 统计每段铁路被经过的次数:
    • 给定城市序列 (P 1 , P 2 , … , P M P_1, P_2, \dots, P_MP1,P2,,PM),相邻两次访问 (P j P_jPj) 到 (P j + 1 P_{j+1}Pj+1) 经过的区间为 ([ min ⁡ ( P j , P j + 1 ) , max ⁡ ( P j , P j + 1 ) − 1 ] [\min(P_j,P_{j+1}), \max(P_j,P_{j+1})-1][min(Pj,Pj+1),max(Pj,Pj+1)1])。
    • 使用差分数组 (d) 对每个区间加 (1),最后前缀和得到每段铁路的经过次数 (k_i)。
  2. 对第 (i) 段铁路,两种方案花费为:
    • 全单程票:(k i × A i k_i \times A_iki×Ai)
    • 买卡:(C i + k i × B i C_i + k_i \times B_iCi+ki×Bi)(因为B i < A i B_i < A_iBi<Ai,购卡后每次花费更少)
      取较小值累加即得答案。
  3. 注意数据范围,使用long long避免溢出。

代码实现

#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;intmain(){intn,m;scanf("%d%d",&n,&m);// n:城市数,m:访问次数vector<int>p(m);// 访问序列for(inti=0;i<m;++i)scanf("%d",&p[i]);vector<ll>d(n+2,0);// 差分数组,1~n-1有效for(inti=0;i<m-1;++i){// 处理每对相邻城市inta=p[i],b=p[i+1];intl=min(a,b),r=max(a,b)-1;// 经过的铁路区间if(l<=r){// 区间非空d[l]+=1;// 差分左端点+1d[r+1]-=1;// 右端点后一位-1}}ll cnt=0,ans=0;// cnt:当前铁路累计次数for(inti=1;i<n;++i){// 遍历1~n-1段铁路cnt+=d[i];// 前缀和得到经过次数ll a,b,c;scanf("%lld%lld%lld",&a,&b,&c);ans+=min(cnt*a,c+cnt*b);// 取较小花费}printf("%lld\n",ans);return0;}

功能分析

  1. 差分统计经过次数:利用d[l] += 1, d[r+1] -= 1在 O(1) 时间内标记区间,最后前缀和得到每条铁路的真实经过次数,时间复杂度 O(N+M)。
  2. 逐段决策:对每条铁路,比较全单程票总价与买卡并充值总价,选择较小者累加。
  3. 空间优化:只使用两个数组(访问序列 p 和差分数组 d),d 大小 N+2,满足10 5 10^5105数据范围。

【完整系列请查看专栏】:
信奥赛C++普及组CSP-J一等奖通关刷题题单及题解:
https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转


各种学习资料,助力大家一站式学习和提升!!!

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return0;}

【秘籍汇总】(完整csp信奥赛C++学习资料):

1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):

https://edu.csdn.net/lecturer/7901 点击跳转

2、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

https://edu.csdn.net/course/detail/41081 点击跳转

3、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html 点击跳转

4、csp信奥赛冲刺一等奖有效刷题题解:

信奥赛C++普及组CSP-J一等奖通关刷题题单及题解:
https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转

信奥赛C++提高组csp-j初赛&复赛真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13125089.html 点击跳转

5、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转


GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html 点击跳转

· 文末祝福 ·

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}
http://www.jsqmd.com/news/903985/

相关文章:

  • 彻底搞懂 Claude Code 的“记忆”机制
  • 围棋AI分析神器LizzieYzy:5分钟掌握职业级复盘技巧
  • Navicat Mac版无限试用重置:3种方法彻底解决14天限制问题
  • 2026年资产管理软件大盘点:主流系统有哪些? - 品牌2025
  • Arduino智能小车设计:旋转头灯系统与机电一体化实践
  • 利用 Taotoken 模型广场为 AIGC 应用快速选型与接入最新旗舰模型
  • 猫抓浏览器插件:你的网页资源捕获神器,三步轻松下载任何视频音频
  • 为什么你的Sora 2 NeRF输出模糊、闪烁、漂移?:20年图形学专家紧急发布的3大隐式场梯度坍塌诊断协议
  • 别再手动配SNMP了!用组策略和注册表批量部署Windows 10监控代理的完整指南
  • 如何轻松备份微信聊天记录:面向普通用户的完整指南
  • 小吨位悬臂吊选型攻略:厂家推荐+避坑要点,新手轻松选合适设备 - 品牌优选官
  • 猫抓浏览器扩展:高效捕获网页媒体资源的完整解决方案
  • 2026义乌婚纱摄影口碑大排行 备婚新人选店可直接参考 - 江湖评测
  • ARM DS-5调试中镜像不匹配警告的解决方案
  • 杰理之开机先报开机提示音在切换蓝牙模式【篇】
  • 本地Cookie管理革命:3分钟掌握完全隐私保护的终极方案
  • Datasheet学习5(STM32)(TODO)
  • 淘宝任务自动化:每天5分钟解放双手的终极解决方案
  • vxe-table 拖拽列字段对数据进行分组
  • 2026兰州加固公司技术解析:甘肃结构碳纤维加固/甘肃老旧建筑加固维修/甘肃老旧建筑地基加固/老旧建筑补强全攻略 - 优质品牌商家
  • Galanin (1-13)-Bradykinin (2-9) amide;GWTLSAGYLLGPPPGFSPFR-NH₂
  • addBumpConnectTargetConstraint 命令详解
  • Nodejs开发者如何通过Taotoken稳定调用Claude模型
  • UniXcoder终极指南:统一跨模态代码智能助手
  • 卫浴散热器厂家哪家专业?专业厂家的核心体现 - 资讯速览
  • 告别杂乱Mac菜单栏:Ice让你重获清爽高效的工作空间
  • 5分钟终极指南:用望言OCR实现10倍速视频字幕提取
  • 3分钟快速修复损坏MP4视频:untrunc终极指南
  • 观察不同时段调用Taotoken上旗舰模型的延迟变化
  • 包头本地金饰变现哪家更省心 六家回收门店真实对比帮你拿主意 - 专业黄金回收