#L3992. 「IOI2023」超车

「IOI2023」超车

题目描述

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

IOI 2023 期间,有 N+1N+1 辆巴士在这条公路上行驶,编号为 00NN。其中:

  • 巴士 ii0i<N0 \le i < N)计划在第 T[i]T[i] 秒从机场出发,行驶 11 公里用时 W[i]W[i] 秒。
  • 巴士 NN 是备用巴士,行驶 11 公里用时 XX 秒,出发时间 YY 待定。

公路上有 MM 个调度站(M>1M > 1),编号 00M1M-1,位于不同位置:

  • 调度站 jj0j<M0 \le j < M)距离机场 S[j]S[j] 公里,且 S[0]=0S[0] = 0(机场),S[M1]=LS[M-1] = L(酒店),满足 S[0]<S[1]<<S[M1]S[0] < S[1] < \cdots < S[M-1]

巴士行驶规则

巴士以最快速度行驶,但若被前方慢车阻挡,需以慢车速度行驶,直到下一个调度站完成超车。形式化定义巴士 ii 到达调度站 jj 的时间 ti,jt_{i,j} 如下:

  1. 初始条件:对 0i<N0 \le i < Nti,0=T[i]t_{i,0} = T[i];对备用巴士 NNtN,0=Yt_{N,0} = Y
  2. 期望到达时间 ei,je_{i,j}0<j<M0 < j < M):
    • 常规巴士: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])
  3. 实际到达时间 ti,jt_{i,j}ei,je_{i,j} 与所有“比巴士 ii 早到达调度站 j1j-1 的巴士的 ek,je_{k,j}”中的最大值,即:$$t_{i,j} = \max\left( e_{i,j}, \max\left\{ e_{k,j} \mid 0 \le k \le N, \, t_{k,j-1} < t_{i,j-1} \right\} \right) $$

你的任务是回答 QQ 个查询:给定备用巴士的出发时间 YY,返回其到达酒店(调度站 M1M-1)的时间。

实现细节

需在程序开始引入库 overtaking.h,并实现以下函数:

1. 初始化函数

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 调用前执行。

2. 查询函数

int64 arrival_time(int64 Y)
  • 参数YY 为备用巴士的出发时间;
  • 返回:备用巴士到达酒店的时间;
  • 说明:每个测试用例调用 QQ 次。

例子

初始化调用

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

常规巴士到达各调度站的时间如下表(忽略备用巴士时):

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

查询 1:arrival_time(0)

备用巴士出发时间 Y=0Y=0,其到达时间如下:

i=4i=4 t4,0=0t_{4,0}=0 e4,1=10e_{4,1}=10 t4,1=10t_{4,1}=10 e4,2=30e_{4,2}=30 t4,2=30t_{4,2}=30 e4,3=60e_{4,3}=60 t4,3=60t_{4,3}=60

返回 6060

查询 2:arrival_time(50)

备用巴士出发时间 Y=50Y=50,其到达时间如下:

i=4i=4 t4,0=50t_{4,0}=50 e4,1=60e_{4,1}=60 t4,1=60t_{4,1}=60 e4,2=80e_{4,2}=80 t4,2=90t_{4,2}=90 e4,3=120e_{4,3}=120 t4,3=130t_{4,3}=130

返回 130130

约束条件

  • 1L1091 \le L \le 10^9
  • 1N10001 \le N \le 1000
  • 0T[i]10180 \le T[i] \le 10^{18}0i<N0 \le i < N);
  • 1W[i]1091 \le W[i] \le 10^90i<N0 \le i < N);
  • 1X1091 \le X \le 10^9
  • 2M10002 \le M \le 1000
  • 0=S[0]<S[1]<<S[M1]=L0 = S[0] < S[1] < \cdots < S[M-1] = L
  • 1Q1061 \le Q \le 10^6
  • 0Y10180 \le Y \le 10^{18}

子任务

子任务 附加限制 分值
1 N=1N=1Q1000Q \le 1000 99
2 M=2M=2Q1000Q \le 1000 1010
3 N,M,Q100N, M, Q \le 100 2020
4 Q5000Q \le 5000 2626
5 无额外约束 3535

评测程序示例

输入格式

  1. 11 行:L  N  X  M  QL \; N \; X \; M \; Q
  2. 22 行:T[0]  T[1]    T[N1]T[0] \; T[1] \; \ldots \; T[N-1]
  3. 33 行:W[0]  W[1]    W[N1]W[0] \; W[1] \; \ldots \; W[N-1]
  4. 44 行:S[0]  S[1]    S[M1]S[0] \; S[1] \; \ldots \; S[M-1]
  5. 5+k5+k 行(0k<Q0 \le k < Q):查询 kkYY 值。

输出格式

1+k1+k 行(0k<Q0 \le k < Q):查询 kk 的返回值(备用巴士到达酒店的时间)。