【JOI 2015 Final】铁路旅行
铁路旅行
题目描述
JOI 国有 NNN 座城市,依次编号为 1,2,⋯,N1,2,\cdots ,N1,2,⋯,N ;还有 N−1N-1N−1 条可双向通行的铁路,依次编号为 1,2,⋯,N−11,2,\cdots ,N-11,2,⋯,N−1 。第 i(1≤i≤N−1)i(1\le i\le N-1)i(1≤i≤N−1) 条铁路连接着城市 iii 和 i+1i+1i+1 。
在 JOI 国有两种乘坐列车的方法:一种是使用纸质车票,另一种是使用 IC 卡。
- 对于铁路 iii ,用纸质车票乘车一次的价格是 AiA_{i}Ai 元。
- 对于铁路 iii ,用 IC 卡乘车一次的价格是 BiB_{i}Bi 元。但是,如果要用 IC 卡在第 iii 条铁路乘车的话,必须事先购买在第 iii 条铁路使用的 IC 卡。购买在第 iii 条铁路使用的 IC 卡需要花费 CiC_{i}Ci 元。只要买过一次这条铁路的 IC 卡,无论在这条铁路使用 IC 卡乘车多少次都可以。
由于用 IC 卡更容易结算费用,用 IC 卡乘车总是比用纸质车票乘车便宜。也就是说,对于 i=1,2,⋯,N−1i=1,2,\cdots ,N-1i=1,2,⋯,N−1 ,总有 Ai>BiA_{i} > B_{i}Ai>Bi 成立。由于各条铁路的 IC 卡规格各不相同,对于任意的 iii ,能在铁路 iii 使用的 IC 卡并不能在其他铁路上使用。
你准备在 JOI 国旅行,从城市 P1P_{1}P1 出发,按照 P2,P3,⋯,PMP_{2},P_{3},\cdots ,P_{M}P2,P3,⋯,PM 的顺序进行参观。行程由 M−1M-1M−1 天组成。第 j(1≤j≤M−1)j(1\le j\le M-1)j(1≤j≤M−1) 天的计划是从城市 PjP_{j}Pj 坐火车移动到 Pj+1P_{j+1}Pj+1 。可能会通过一些铁路中转。而且,你有可能多次参观同一座城市。因为 JOI 国的铁路速度很快,所以无论从哪座城市到哪座城市都能在 111 天之内到达。
现在你并没有任何一条铁路的 IC 卡。你想要买其中一些铁路的 IC 卡,从而使这次旅行所需的金额,也就是说,买 IC 卡和乘坐列车的费用总和最小。
任务
编写程序以输入 JOI 国的城市数、旅行的行程以及 JOI 国中每一条铁路的票价和 IC 卡价格,求出旅行所需费用的最小值。
输入格式
从标准输入输入数据,格式见下:
- 第一行是两个由空格隔开的整数 NNN 和 MMM ,含义如题面所述;
- 第二行是由空格隔开的 MMM 个整数 P1,P2,⋯,PMP_{1},P_{2},\cdots ,P_{M}P1,P2,⋯,PM ,表示第 j(1≤j≤M−1)j(1\le j\le M-1)j(1≤j≤M−1) 天从城市 PjP_{j}Pj 坐火车到城市 Pj+1P_{j+1}Pj+1 ;
- 接下来 N−1N-1N−1 行,其中第 i(1≤i≤N−1)i(1\le i\le N-1)i(1≤i≤N−1) 行有三个由空格隔开的整数 Ai,Bi,CiA_{i},B_{i},C_{i}Ai,Bi,Ci ,分别表示对于铁路 iii ,用纸质车票乘车的价格为 AiA_{i}Ai 元,用 IC 卡乘车的价格为 BiB_{i}Bi元,购买 IC 卡的价格为 CiC_{i}Ci 元。
输出格式
输出到标准输出,仅一行一个整数,即以元为单位的总花费最小值。
样例
输入样例 1
4 4
1 3 2 4
120 90 100
110 50 80
250 70 130
输出样例 1
550
样例说明 1
在这种情况下,旅行总花费最小的方案如下:
- 购买铁路 222 和 333 的 IC 卡。花去 80+130=21080+130=21080+130=210 元。
- 第一天,使用纸质车票从城市 111 到城市 222 ,然后使用 IC 卡从城市 222 到 333 。花去 120+50=170120+50=170120+50=170 元。
- 第二天,使用 IC 卡从城市 333 到城市 222 。花去 505050 元。
- 第三天,使用 IC 卡从城市 222 到城市 333 ,然后使用 IC 卡从城市 333 到城市 444 。花去 50+70=12050+70=12050+70=120 元。
如果像这样乘车的话,旅行的总花费为 210+170+50+120=550210+170+50+120=550210+170+50+120=550 元,是能够达到的最小值,因此输出 550550550。
输入样例 2
8 5
7 5 3 5 4
12 5 8
16 2 1
3 1 5
17 12 17
19 7 5
12 2 19
4 1 3
输出样例 2
81
数据范围与提示
全部的输入数据满足:
- 2≤N≤1052\le N\le 10^52≤N≤105
- 2≤M≤1052\le M\le 10^52≤M≤105
- 1≤Bi<Ai≤105(1≤i≤N−1)1\le B_{i} < A_{i}\le 10^5(1\le i \le N-1)1≤Bi<Ai≤105(1≤i≤N−1)
- 1≤Ci≤105(1≤i≤N−1)1\le C_{i}\le 10^5(1\le i \le N-1)1≤Ci≤105(1≤i≤N−1)
- 1≤Pj≤N(1≤j≤M)1\le P_{j}\le N(1\le j \le M)1≤Pj≤N(1≤j≤M)
- Pj≠Pj+1(1≤j≤M−1)P_{j}\ne P_{j+1}(1\le j\le M-1)Pj≠Pj+1(1≤j≤M−1)
子任务 1 [202020 分]
满足以下条件:
- 2≤N≤10002\le N \le 10002≤N≤1000
- M=2M=2M=2
- 1≤Bi<Ai≤1000(1≤i≤N−1)1\le B_{i} < A_{i}\le 1000(1\le i \le N-1)1≤Bi<Ai≤1000(1≤i≤N−1)
- 1≤Ci≤1000(1≤i≤N−1)1\le C_{i}\le 1000(1\le i \le N-1)1≤Ci≤1000(1≤i≤N−1)
子任务 2 [303030 分]
满足以下条件:
- 2≤N≤10002\le N \le 10002≤N≤1000
- 2≤M≤10002\le M \le 10002≤M≤1000
- 1≤Bi<Ai≤1000(1≤i≤N−1)1\le B_{i} < A_{i}\le 1000(1\le i \le N-1)1≤Bi<Ai≤1000(1≤i≤N−1)
- 1≤Ci≤1000(1≤i≤N−1)1\le C_{i}\le 1000(1\le i \le N-1)1≤Ci≤1000(1≤i≤N−1)
子任务 3 [505050 分]
没有额外限制。
吐槽:日本的JOI就这么水吗。。。
解析:
回到题目,我们发现只要算出每条铁路经过了多少次再比较是用纸质车票更优还是用 IC 卡更优就可以了,计算使用次数相当于区间修改单点查询,直接用树状数组就可以实现了。
代码:
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int Max=100010;
int n,m;
LL ans,a[Max],b[Max],c[Max];
int p[Max],sum[Max];
inline int get_int()
{int x=0,f=1;char c;for(c=getchar();(!isdigit(c))&&(c=='-');c=getchar());if(c=='-') {f=-1;c=getchar();}for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';return x*f;
}
inline LL mn(LL x,LL y){return x > y ? y : x;}
inline int mx(int x,int y){return x > y ? x : y;}
inline void add(int pos,int x){for(;pos<=n;pos+=pos&(-pos)) sum[pos]+=x;}
inline int Q(int pos)
{int ans=0;for(;pos;pos-=pos&-pos) ans+=sum[pos];return ans;
}
inline void print(LL x)
{if(x < 0) putchar('-'),x=-x;if(x > 9) print(x/10);putchar('0' + x % 10);
}int main()
{n=get_int(),m=get_int();for(int i=1;i<=m;i++) p[i]=get_int();for(int i=1;i<=n-1;i++) a[i]=get_int(),b[i]=get_int(),c[i]=get_int();for(int i=1;i<=m-1;i++) add(mn(p[i],p[i+1]),1),add(mx(p[i],p[i+1]),-1);for(int i=1;i<=n-1;i++){LL num = Q(i);ans += mn(a[i] * num , c[i] + b[i] * num);}print(ans),putchar('\n');return 0;
}
【JOI 2015 Final】铁路旅行相关推荐
- 迎开学水题狂欢赛(舞踏会[dp+三叉树],HH去散步[矩阵快速幂],排序[模拟],铁路旅行[线段树])
快速简单记录老师口胡(可能就我自己看得懂了吧-) 文章目录 T1:舞踏会 title solution code T2:HH去散步 title solution code T3:排序 title so ...
- [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分
题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...
- 「JOI 2016 Final」断层
嘟嘟嘟 今天我们模拟考这题,出的是T3.实在是没想出来,就搞了个20分暴力(还WA了几发). 这题关键在于逆向思维,就是考虑最后的\(n\)的个点刚开始在哪儿,这样就减少了很多需要维护的东西. 这就让 ...
- Luogu P5103 「JOI 2016 Final」断层 树状数组or线段树+脑子
太神仙了这题... 原来的地面上升,可以倒着操作(时光倒流),转化为地面沉降,最后的答案就是每个点的深度. 下面的1,2操作均定义为向下沉降(与原题意的变换相反): 首先这个题目只会操作前缀和后缀,并 ...
- [JOI 2014 Final]裁剪线
题目 传送门 to LOJ 思路 思路来自于官方题解,有兴趣的 日语高超的 可以自己找来看一看.这里就直接贴出翻译后的截图了 考虑一种并查集的做法,给每一个"区域"分配一个并查集编 ...
- T3:LOJ2332「JOI 2017 Final」焚风现象.cpp
记录差值 然后每次运算一下头和尾 如果尾端是最后一次增加则不用运算尾端 详见代码 #include<iostream> #include<cstdio> #include< ...
- Libre OJ P2332「JOI 2017 Final」焚风现象【差分思想】By cellur925
题目传送门 这道题开始看起来会很晕...\(qwq\).首先我们要明确题目中的海拔&&温度.温度是受海拔影响的,每次改变的是海拔,我们求的是温度. 我们开始读入的时候便可以处理出开始\ ...
- 【2018.10.1】「JOI 2014 Final」年轮蛋糕
题面 一看到求"最小值的最大值"这种问题,就能想到二分了. 二分答案,然后我们要把一圈分成三块,使这三块的大小都$\geq mid$.做法是把环展开成2倍长度的链,先钦定一个起点, ...
- [JOI 2021 Final]有趣的家庭菜园( とてもたのしい家庭菜園 4)
输入数据 1 5 3 2 2 3 1 输出数据 1 3 输入数据 2 5 9 7 5 3 1 输出数据 2 0 输入数据 3 2 2021 2021 输出数据 3 1 输入数据 4 8 12 2 34 ...
最新文章
- JVM 面试考点总结
- Xamarin.Forms的滚动视图ScrollView
- stm32 micropython vscode_在vscode里基于Pymakr插件进行esp32的micropython开发
- 摘抄 :methodology 怎么写
- hdu 5247(RMQ+枚举)
- 从三大顶会论文看百变Self-Attention
- Apache 配置虚拟目录、主机的疑惑及解决
- java 品尝饮料,java细节经典题型
- Rman--状态管理命令
- Python全栈开发之数据类型
- 局部变量 和 全局变量
- 理解WebKit和Chromium: Content API和CEF3
- Trained Tesseract on 瘦金体 successfully!!
- 怎样做终端安全防御?
- android 发送短信的两种方式
- Codeforces Round #433 (Div. 1, based on Olympiad of Metropolises) C. Boredom(主席树)
- ubuntu显示隐藏文件
- 电脑计算机为什么不是有效程序,电脑提示“不是有效的win32应用程序”是什么原因【解决方法】...
- 台式计算机 蓝牙,台式电脑蓝牙在哪里打开(手把手教你打开台式电脑蓝牙)...
- FOP生成PDF中文乱码问题解决