P3406 海底高铁

https://www.luogu.com.cn/problem/P3406
涉及知识点:差分,前缀和
黄色题
 
思路:
对于每一个区间,我们可以在其左端点加上区间增的权值,再在右端点+1的位置减去区间增的权值,最后对该区间进行求前缀和操作。这样,我们可以得到一样的结果。

#include<cstdio> #include<iostream> #include<algorithm> typedef long long L;//给long long取一个别名 using namespace std; L n,m;//long long n,m L p[100005]; L a[100005],b[100005],c[100005]; L money;//最终的钱 L each[100005];//每段铁路经过的次数 int main() { cin>>n>>m; for(int i=1;i<=m;i++){ cin>>p[i]; if(i==1){ continue; } each[min(p[i-1],p[i])]++;//差分 each[max(p[i-1],p[i])]--; } for(int i=1;i<=n;i++){ each[i]+=each[i-1]; } for(int i=1;i<n;i++){ cin>>a[i]>>b[i]>>c[i]; money+=min((a[i]*each[i]),(b[i]*each[i]+c[i])); } cout<<money;//完美结束 return 0; }

注意:
1.由于给定的信息是端点(城市),但是要求的是区间(路段),所以循环次数应为城市数-1

2.对于端点的处理,要严格满足数学上的定义,小的在左端点,大的在右端点否则对于逆序信息,就相当于进行了区间减操作


__EOF__

本文作者灰の魔女伊蕾娜
本文链接https://www.cnblogs.com/2elaina/p/16494882.html
关于博主:编程小萌新一名,希望从今天开始慢慢提高,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   -イレイナ  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示