#L3992. 「IOI2023」超车
「IOI2023」超车
题目描述
从布达佩斯机场到 Forrás 酒店有一条单向单车道的公路,公路的长度为 公里。
IOI 2023 活动期间,有 辆巴士在这条公路上行驶。巴士从 到 依次编号。巴士 ()计划在活动的第 秒从机场出发,行驶一公里用时 秒。巴士 是备用巴士,行驶一公里用时 秒。它从机场出发的时间 尚未确定。
巴士在这条公路上行驶时一般不允许超车,但允许在一些被称为调度站的地方进行超车。公路上一共有 个调度站(),从 到 依次编号,位于公路的不同位置。调度站 ()的位置在机场出发后沿公路的 公里处。调度站按照从机场开始的距离递增排列,也就是对于每个 ,有 。首个调度站设在机场,最后一个设在酒店。也就是说,,。
每辆巴士都以指定的最快速度行驶,除非它遇到前面有比它慢的巴士。在这种情况下,后面的快车会被前面的慢车压着,被迫以慢车的速度行驶。这种情况会持续到两车到达下一个调度站。在那里,快车会完成对慢车的超越。
形式化地说,对于满足 且 的每组 和 ,巴士 到达调度站 的时间 (以秒为单位)定义如下:
- 对于每个 ,有 。另有 。
- 对于满足 的每个 :
- 定义巴士 到达调度站 的期望到达时间 (以秒为单位)为巴士 到达调度站 之后以全速行驶到达调度站 的时间。也就是说,
- 对于每个 ,有 ;
- 另有 。
- 巴士 到达调度站 的时间,是巴士 到达调度站 的期望到达时间,以及其他比巴士 早到调度站 的巴士到达调度站 的期望到达时间中的最大值。形式化地说, 是 和所有满足 且 的 中的最大值。
- 定义巴士 到达调度站 的期望到达时间 (以秒为单位)为巴士 到达调度站 之后以全速行驶到达调度站 的时间。也就是说,
IOI 组委会想要调度备用巴士(巴士 )。你的任务是回答组委会的 个问题,问题的形式如下:给定备用巴士从机场出发的时间 (以秒为单位),它将于何时到达酒店?
实现细节
你需要在程序开始引入库 overtaking.h。
你的任务是实现以下函数:
void init(int L, int N, int64[] T, int[] W, int X, int M, int[] S)
- :公路的长度
- :常规(非备用)巴士的数量
- :长度为 的数组,描述常规巴士计划从机场出发的时间。
- :长度为 的数组,描述常规巴士的最大速度。
- :备用巴士行驶一公里所需的时间
- :调度站的数量
- :长度为 的数组,描述从机场到调度站的距离。
对于每个测试用例,这个函数都恰好调用一次,发生在对任何 arrival_time 的调用之前。
int64 arrival_time(int64 Y)
- :备用巴士(巴士 )计划从机场出发的时间
- 这个函数应该返回备用巴士到达酒店的时间。
- 这个函数恰好调用 次。
例子
考虑以下调用序列:
init(6, 4, [20, 10, 40, 0], [5, 20, 20, 30], 10, 4, [0, 1, 3, 6])
忽略巴士 (它还没有确定出发时间),下表列出了巴士到达每个调度站的期望时间和实际时间:
| 0 | 20 | 25 | 30 | 40 | 55 | ||
| 1 | 10 | 30 | 70 | 130 | |||
| 2 | 40 | 60 | 100 | 160 | 180 | ||
| 3 | 0 | 30 | 90 | 180 | |||
巴士到达调度站 的时间就是它计划从机场出发的时间。也就是说,对于 ,。
到达调度站 的期望时间和实际时间计算如下:
- 调度站 的期望到达时间:
- 巴士 :$e_{0,1} = t_{0,0} + W[0] \cdot (S[1]-S[0]) = 20 + 5 \cdot 1 = 25$。
- 巴士 :$e_{1,1} = t_{1,0} + W[1] \cdot (S[1]-S[0]) = 10 + 20 \cdot 1 = 30$。
- 巴士 :$e_{2,1} = t_{2,0} + W[2] \cdot (S[1]-S[0]) = 40 + 20 \cdot 1 = 60$。
- 巴士 :$e_{3,1} = t_{3,0} + W[3] \cdot (S[1]-S[0]) = 0 + 30 \cdot 1 = 30$。
- 调度站 的到达时间:
- 巴士 和 早于巴士 到达调度站 ,所以 。
- 巴士 早于巴士 到达调度站 ,所以 。
- 巴士 、巴士 和巴士 早于巴士 到达调度站 ,所以 $t_{2,1} = \max([e_{0,1},e_{1,1},e_{2,1},e_{3,1}]) = 60$。
- 没有比巴士 更早到达调度站 的巴士,所以 。
arrival_time(0)
巴士 行驶一公里需要 秒,现在计划在第 秒从机场出发。这种情况下,下表列出每辆巴士的到达时间。常规巴士期望和实际到达时间的唯一变动用下划线标注。
| 0 | 20 | 25 | 30 | 40 | 55 | ||
| 1 | 10 | 30 | 70 | 130 | |||
| 2 | 40 | 60 | 100 | 160 | 180 | ||
| 3 | 0 | 30 | 90 | 180 | |||
| 4 | 10 | 30 | 60 | ||||
由此可知巴士 在第 秒到达酒店。因此,函数应该返回 。
arrival_time(50)
巴士 现在计划在第 秒从机场出发。这种情况下,与初始表格相比,常规巴士的到达时间没有变化。下表列出了到达时间。
| 0 | 20 | 25 | 30 | 40 | 55 | ||
| 1 | 10 | 30 | 70 | 130 | |||
| 2 | 40 | 60 | 100 | 160 | 180 | ||
| 3 | 0 | 30 | 90 | 90 | 180 | ||
| 4 | 50 | 60 | 80 | 120 | 130 | ||
巴士 和较慢的巴士 同时到达调度站 ,然后巴士 超过了巴士 。接着,巴士 在调度站 和 之间行驶时被巴士 压着,导致它到达调度站 的时间是第 秒,而不是第 秒。在过了调度站 之后,巴士 被巴士 压着,直到它们到达酒店。巴士 在第 秒到达酒店。因此,函数应该返回 。
将每辆巴士从机场出发到不同距离的时间画成折线图。图中 轴表示从机场出发的距离(以公里为单位), 轴表示时间(以秒为单位)。竖的虚线标注了调度站的位置。不同颜色的实线(标注了巴士的编号)表示四辆常规巴士。黑色的点线表示备用巴士。

约束条件
- (对于满足 的每个 )
- (对于满足 的每个 )
子任务
- (9 分),
- (10 分),
- (20 分)
- (26 分)
- (35 分)没有额外的约束条件。
评测程序示例
评测程序示例按以下格式读取输入:
- 第 行:
- 第 行:
- 第 行:
- 第 行:
- 第 行():问题 的
评测程序示例按以下格式打印你的答案:
- 第 行():问题 中
arrival_time的返回值