#P9604. [IOI2023] 超车

[IOI2023] 超车

题目背景

这是一道交互题,你只需要实现代码中要求的函数。

你的代码不需要引用任何额外的头文件,也不需要实现 main 函数。

本题仅支持 C++ 语言提交。但请勿使用 C++14 (GCC 9)

题目描述

从布达佩斯机场到 Forrás 酒店有一条单向单车道的公路,公路的长度为 LL 公里。

IOI 2023 活动期间,有 N+1N+1 辆巴士在这条公路上行驶。巴士从 00NN 依次编号。巴士 ii0i<N0 \le i \lt N)计划在活动的第 T[i]T[i] 秒从机场出发,行驶一公里用时 W[i]W[i] 秒。巴士 NN 是备用巴士,行驶一公里用时 XX 秒。它从机场出发的时间 YY 尚未确定。

巴士在这条公路上行驶时一般不允许超车,但允许在一些被称为调度站的地方进行超车。公路上一共有 MM 个调度站(M>1M \gt 1),从 00M1M - 1 依次编号,位于公路的不同位置。调度站 jj0j<M0 \le j \lt M)的位置在机场出发后沿公路的 S[j]S[j] 公里处。调度站按照从机场开始的距离递增排列,也就是对于每个 0jM20 \le j \le M - 2,有 S[j]<S[j+1]S[j] \lt S[j+1]。首个调度站设在机场,最后一个设在酒店。也就是说,S[0]=0S[0] = 0S[M1]=LS[M-1] = L

每辆巴士都以指定的最快速度行驶,除非它遇到前面有比它慢的巴士。在这种情况下,后面的快车会被前面的慢车压着,被迫以慢车的速度行驶。这种情况会持续到两车到达下一个调度站。在那里,快车会完成对慢车的超越。

形式化地说,对于满足 0iN0 \le i \le N0j<M0 \le j \lt M 的每组 iijj,巴士 ii 到达调度站 jj 的时间 ti,jt_{i,j}(以秒为单位)定义如下:对于每个 0i<N0 \le i \lt N,有 ti,0=T[i]t_{i,0} = T[i]。另有 tN,0=Yt_{N,0} = Y。对于满足 0<j<M0 \lt j \lt M 的每个 jj

  • 定义巴士 ii 到达调度站 jj期望到达时间 ei,je_{i,j}(以秒为单位)为巴士 ii 到达调度站 j1j-1 之后以全速行驶到达调度站 jj 的时间。也就是说,
    • 对于每个 0i<N0 \le i \lt N,有 ei,j=ti,j1+W[i](S[j]S[j1])e_{i,j} = t_{i,j-1} + W[i] \cdot (S[j]-S[j-1])
    • 另有 eN,j=tN,j1+X(S[j]S[j1])e_{N,j} = t_{N,j-1} + X \cdot (S[j]-S[j-1])
  • 巴士 ii 到达调度站 jj 的时间,是巴士 ii 到达调度站 jj 的期望到达时间,以及其他比巴士 ii 早到调度站 j1j-1 的巴士到达调度站 jj 的期望到达时间中的最大值。形式化地说,ti,jt_{i,j}ei,je_{i,j} 和所有满足 0kN0 \le k \le Ntk,j1<ti,j1t_{k,j-1} \lt t_{i,j-1}ek,je_{k,j} 中的最大值。

IOI 组委会想要调度备用巴士(巴士 NN)。你的任务是回答组委会的 QQ 个问题,问题的形式如下:给定备用巴士从机场出发的时间 YY(以秒为单位),它将于何时到达酒店?

输入格式

评测程序示例按以下格式读取输入:

  • 11 行:L  N  X  M  QL \; N \; X \; M \; Q
  • 22 行:T[0]  T[1]    T[N1]T[0] \; T[1] \; \ldots \; T[N-1]
  • 33 行:W[0]  W[1]    W[N1]W[0] \; W[1] \; \ldots \; W[N-1]
  • 44 行:S[0]  S[1]    S[M1]S[0] \; S[1] \; \ldots \; S[M-1]
  • 5+k5 + k 行(0k<Q0 \le k \lt Q):问题 kkYY

输出格式

评测程序示例按以下格式打印你的答案:

  • 1+k1 + k 行(0k<Q0 \le k \lt Q):问题 kkarrival_time 的返回值
6 4 10 4 2
20 10 40 0
5 20 20 30
0 1 3 6
0
50

60
130

提示

【实现细节】

你的任务是实现以下函数:

void init(int L, int N, int64[] T, int[] W, int X, int M, int[] S)
  • LL:公路的长度
  • NN:常规(非备用)巴士的数量
  • TT:长度为 NN 的数组,描述常规巴士计划从机场出发的时间。
  • WW:长度为 NN 的数组,描述常规巴士的最大速度。
  • XX:备用巴士行驶一公里所需的时间
  • MM:调度站的数量
  • SS:长度为 MM 的数组,描述从机场到调度站的距离。
  • 对于每个测试用例,这个函数都恰好调用一次,发生在对任何 arrival_time 的调用之前。
int64 arrival_time(int64 Y)
  • YY:备用巴士(巴士 NN)计划从机场出发的时间
  • 这个函数应该返回备用巴士到达酒店的时间。
  • 这个函数恰好调用 QQ 次。

【例子】

考虑以下调用序列:

init(6, 4, [20, 10, 40, 0], [5, 20, 20, 30], 10, 4, [0, 1, 3, 6])

忽略巴士 44(它还没有确定出发时间),下表列出了巴士到达每个调度站的期望时间和实际时间:

ii ti,0t_{i,0} ei,1e_{i,1} ti,1t_{i,1} ei,2e_{i,2} ti,2t_{i,2} ei,3e_{i,3} ti,3t_{i,3}
00 2020 2525 3030 4040 5555
11 1010 3030 7070 130130
22 4040 6060 100100 160160 180180
33 00 3030 9090 180180

巴士到达调度站 00 的时间就是它计划从机场出发的时间。也就是说,对于 0i30 \le i \le 3ti,0=T[i]t_{i,0} = T[i]

到达调度站 11 的期望时间和实际时间计算如下:

  • 调度站 11 的期望到达时间:
    • 巴士 00:$e_{0,1} = t_{0,0} + W[0] \cdot (S[1]-S[0]) = 20 + 5 \cdot 1 = 25$。
    • 巴士 11:$e_{1,1} = t_{1,0} + W[1] \cdot (S[1]-S[0]) = 10 + 20 \cdot 1 = 30$。
    • 巴士 22:$e_{2,1} = t_{2,0} + W[2] \cdot (S[1]-S[0]) = 40 + 20 \cdot 1 = 60$。
    • 巴士 33:$e_{3,1} = t_{3,0} + W[3] \cdot (S[1]-S[0]) = 0 + 30 \cdot 1 = 30$。
  • 调度站 11 的到达时间:
    • 巴士 1133 早于巴士 00 到达调度站 00,所以 t0,1=max([e0,1,e1,1,e3,1])=30t_{0,1} = \max([e_{0,1},e_{1,1},e_{3,1}]) = 30
    • 巴士 33 早于巴士 11 到达调度站 00,所以 t1,1=max([e1,1,e3,1])=30t_{1,1} = \max([e_{1,1},e_{3,1}]) = 30
    • 巴士 00、巴士 11 和巴士 33 早于巴士 22 到达调度站 00,所以 $t_{2,1} = \max([e_{0,1},e_{1,1},e_{2,1},e_{3,1}]) = 60$。
    • 没有比巴士 33 更早到达调度站 00 的巴士,所以 t3,1=max([e3,1])=30t_{3,1} = \max([e_{3,1}]) = 30
arrival_time(0)

巴士 44 行驶一公里需要 1010 秒,现在计划在第 00 秒从机场出发。 这种情况下,下表列出每辆巴士的到达时间。 常规巴士期望和实际到达时间的唯一变动用下划线标注。

ii ti,0t_{i,0} ei,1e_{i,1} ti,1t_{i,1} ei,2e_{i,2} ti,2t_{i,2} ei,3e_{i,3} ti,3t_{i,3}
00 2020 2525 3030 4040 5555 60\underline{60}
11 1010 3030 7070 130130
22 4040 6060 100100 160160 180180
33 00 3030 9090 180180
44 1010 3030 6060

由此可知巴士 44 在第 6060 秒到达酒店。 因此,函数应该返回 6060

arrival_time(50)

巴士 44 现在计划在第 5050 秒从机场出发。 这种情况下,与初始表格相比,常规巴士的到达时间没有变化。 下表列出了到达时间。

ii ti,0t_{i,0} ei,1e_{i,1} ti,1t_{i,1} ei,2e_{i,2} ti,2t_{i,2} ei,3e_{i,3} ti,3t_{i,3}
00 2020 2525 3030 4040 5555
11 1010 3030 7070 130130
22 4040 6060 100100 160160 180180
33 00 3030 9090 9090 180180
44 5050 6060 8080 120120 130130

巴士 44 和较慢的巴士 22 同时到达调度站 11,然后巴士 44 超过了巴士 22。 接着,巴士 44 在调度站 1122 之间行驶时被巴士 33 压着,导致它到达调度站 22 的时间是第 9090 秒,而不是第 8080 秒。 在过了调度站 22 之后,巴士 44 被巴士 11 压着,直到它们到达酒店。 巴士 44 在第 130130 秒到达酒店。 因此,函数应该返回 130130

将每辆巴士从机场出发到不同距离的时间画成折线图。 图中 x 轴表示从机场出发的距离(以公里为单位),y 轴表示时间(以秒为单位)。 竖的虚线标注了调度站的位置。 不同颜色的实线(标注了巴士的编号)表示四辆常规巴士。 黑色的点线表示备用巴士。

arrival_time(0) arrival_time(50)

【约束条件】

  • 1L1091 \le L \le 10^9
  • 1N10001 \le N \le 1\,000
  • 0T[i]10180 \le T[i] \le 10^{18}(对于满足 0i<N0 \le i \lt N 的每个 ii
  • 1W[i]1091 \le W[i] \le 10^9(对于满足 0i<N0 \le i \lt N 的每个 ii
  • 1X1091 \le X \le 10^9
  • 2M10002 \le M \le 1\,000
  • 0=S[0]<S[1]<<S[M1]=L0 = S[0] \lt S[1] \lt \cdots \lt S[M-1] = L
  • 1Q1061 \le Q \le 10^6
  • 0Y10180 \le Y \le 10^{18}

【子任务】

  1. (9 分)N=1,Q1000N = 1, Q \le 1\,000
  2. (10 分)M=2,Q1000M = 2, Q \le 1\,000
  3. (20 分)N,M,Q100N, M, Q \le 100
  4. (26 分)Q5000Q \le 5\,000
  5. (35 分)没有额外的约束条件。