#P10538. [APIO2024] 星际列车

    ID: 9933 Type: RemoteJudge 1000ms 1000MiB Tried: 0 Accepted: 0 Difficulty: 6 Uploaded By: Tags>动态规划,dp2024APIO交互题动态规划优化

[APIO2024] 星际列车

题目背景

请勿使用 C++14(GCC9) 提交

在 2992 年,机器人已经取代了人类的大部分工作,大家都有着大量的空闲时间。因此你和家人决定利用这些时间来一场星际旅行。

NN 个人类已经可以到达的行星,编号为 00N1N - 1,以及 MM 种不同的星际列车路线。第 ii 种列车路线 (0i<M0 \le i < M) 在时间 A[i]A[i] 从行星 X[i]X[i] 出发,在时间 B[i]B[i] 到达行星 Y[i]Y[i],票价为 C[i]C[i]。在行星之间,这些星际列车是仅有的交通方式。对于你搭乘的一列星际列车,你只能在它的终点站下车,并且你搭乘的下一趟列车的起点站必须和这趟列车的终点站相同(这里认为换乘不耗时)。形式化地,你可以依次乘坐第 q[0],q[1],,q[P]q[0], q[1], \ldots, q[P] 次列车,当且仅当对任意 1kP1 \le k \le P 都有 Y[q[k1]]=X[q[k]]Y[q[k - 1]] = X[q[k]]B[q[k1]]A[q[k]]B[q[k - 1]] \le A[q[k]]

在不同行星之间移动是非常耗时的,所以除了车票钱,餐费支出也不可忽视。列车上免费提供不限量的食物,也就是在列车上吃饭不花钱:如果你决定乘坐第 i 种星际列车,则在任何 A[i]A[i]B[i]B[i] 之间的时刻(包括端点)你都可以免费吃任意多顿饭。但如果你决定在行星 ii 吃饭,每顿饭都需要 T[i]T[i] 元。

你和家人在旅途中总共需要吃 WW 顿饭,第 i (0i<W)i\ (0 \le i < W) 顿饭可以在 L[i]L[i]R[i]R[i](包括端点)的任何时刻吃,吃饭不耗费时间。吃饭没有顺序要求,例如允许在吃完第 11 顿饭后再吃第 00 顿饭(见样例 22)。

现在是 00 时刻,你和家人正在 00 号行星上。你需要求出到达 N1N - 1 号行星的最小花费,花费定义为车票价格和餐费之和。如果无法到达 N1N - 1 号行星,最小花费定义为 1-1

题目描述

你无需在程序开头引入库 train.h

你只需要实现以下函数:

long long solve(int N, int M, int W, std::vector<int> T,
                std::vector<int> X, std::vector<int> Y,
                std::vector<int> A, std::vector<int> B, std::vector<int> C,
                std::vector<int> L, std::vector<int> R);
  • NN:行星数量。
  • M M:星际列车路线数量。
  • WW:需要用餐的次数。
  • TT:一个长度为 NN 的数组。T[i]T[i] 表示在行星 ii 每次用餐的花费。
  • X,Y,A,B,CX, Y, A, B, C:五个长为 MM 的数组。(X[i],Y[i],A[i],B[i],C[i])(X[i], Y[i], A[i], B[i], C[i]) 描述了第 ii 条列车路线。
  • L,RL, R:两个长为 WW 的数组。(L[i],R[i])(L[i], R[i]) 描述了第 ii 顿饭的用餐时间。
  • 你需要返回从行星 00 到达行星 N1N - 1 的最小花费。如果行星 N1N - 1 不可达,返回 1-1
  • 每个测试点中,该函数恰好被调用一次。

输入格式

评测程序示例读取如下格式的输入:

  • 11 行:N M WN\ M\ W
  • 22 行:T[0] T[1] T[2]  T[N1]T[0]\ T[1]\ T[2]\ \ldots\ T[N - 1]
  • 3+i (0i<M)3 + i\ (0 \le i < M) 行:X[i] Y[i] A[i] B[i] C[i]X[i]\ Y[i]\ A[i]\ B[i]\ C[i]
  • 3+M+i (0i<W)3 + M + i\ (0 \le i < W) 行:L[i] R[i]L[i]\ R[i]

输出格式

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

  • 11 行:函数 solve 的返回值
3 3 1 
20 30 40
0 1 1 15 10
1 2 20 30 5
0 2 18 40 40
16 19
40
3 5 6
30 38 33
0 2 12 16 38
1 0 48 50 6
0 1 26 28 23
0 2 6 7 94
1 2 49 54 50
32 36
14 14
42 45
37 40
2 5
4 5
197

提示

样例解释

对于样例一,考虑如下调用:

solve(3, 3, 1, {20, 30, 40}, {0, 1, 0}, {1, 2, 2},
        {1, 20, 18}, {15, 30, 40}, {10, 5, 40}, {16}, {19});

一种可行的方案是依次乘坐第 0,10, 1 次列车,花费为 4545,具体流程如下:

时刻 你的行动 花费
11 乘坐第 00 次列车从 00 号行星出发 1010
1515 到达 11 号行星
1616 11 号行星吃第 00 顿饭 3030
2020 乘坐第 11 次列车从 11 号行星出发 55
3030 到达 22 号行星

一种更优的方案是乘坐第 22 次列车,花费为 4040,具体流程如下:

时刻 你的行动 花费
1818 乘坐第 22 次列车从 00 号行星出发 4040
1919 在第 22 次列车上吃第 00 顿饭
4040 到达 22 号行星

在这种方案中,在时刻 1818 在第 22 次列车上吃第 00 顿饭也是合法的。

因此函数应该返回 4040

对于样例二,考虑如下调用:

solve(3, 5, 6, {30, 38, 33}, {0, 1, 0, 0, 1}, {2, 0, 1, 2, 2},
        {12, 48, 26, 6, 49}, {16, 50, 28, 7, 54}, {38, 6, 23, 94, 50},
        {32, 14, 42, 37, 2, 4}, {36, 14, 45, 40, 5, 5});

最优解是:乘坐第 00 次列车,车费为 3838。在第 00 次列车上免费吃第 11 顿饭。第 0,2,30, 2, 3 顿饭在行星 22 上吃 ,花费 33×3=9933 \times 3 = 99。 第 4,54, 5 顿饭在行星 00 上吃,花费 30×2=6030 \times 2 = 60。总花费为 38+99+60=19738 + 99 + 60 = 197

因此函数应该返回 197197

数据范围

  • 2N1052 \le N \le 10^5
  • 0M,W1050 \le M, W \le 10^5
  • 0X[i],Y[i]<N,X[i]Y[i]0 \le X[i], Y [i] < N, X[i] \neq Y[i]
  • 1A[i]<B[i]1091 \le A[i] < B[i] \le 10^9
  • 1T[i],C[i]1091 \le T[i], C[i] \le 10^9
  • 1L[i]R[i]1091 \le L[i] \le R[i] \le 10^9

详细子任务附加限制及分值如下表所示。

子任务编号 附加限制 分值
11 N,M,A[i],B[i],L[i],R[i]103,W10N, M, A[i], B[i], L[i], R[i] \le 10^3, W \le 10 55
22 W=0W = 0
33 每顿饭的用餐时间两两不交。形式化地,对于任何时刻 zz 满足 1z1091 \le z \le 10^9,至多存在一个 i (0i<W)i\ (0 \le i < W) 使得 L[i]zR[i]L[i] \le z \le R[i] 3030
44 没有额外的约束条件 6060