AT_joisc2021_d 逃走経路 (Escape Route)

题目背景

秘密组织 JOI 团在 IOI 国活动,成员需避开道路检查点完成城市间移动。

题目描述

IOI 国的一天被划分为 $S$ 个单位时间(单位:皮秒)。每日起点开始经过 $x$ 皮秒 $(0 \leq x < S)$ 的时刻称为**时刻 $x$**。国家包含 $N$ 座城市(编号 $0$ 至 $N-1$)和 $M$ 条双向道路(编号 $0$ 至 $M-1$),任意两城市均可通过若干道路互通。 每条道路 $i$ $(0 \leq i \leq M-1)$ 具有以下属性: - 连接城市 $A_i$ 与 $B_i$。 - 通行耗时 $L_i$ 皮秒。 - 每日从**时刻 $C_i$** 至当日结束进行全路段检查。 JOI 团成员使用道路 $i$ 时,必须满足: - 在时刻 $x$ 从 $A_i$ 或 $B_i$ 出发,且 $0 \leq x \leq C_i - L_i$。 - 在时刻 $x + L_i$ 到达另一城市。 (检查期间允许停留在 $A_i$ 或 $B_i$) 现有 $Q$ 名成员(编号 $0$ 至 $Q-1$): - 成员 $j$ 于某日**时刻 $T_j$** 从 $U_j$ 出发前往 $V_j$。 - 移动中可在城市等待(可能耗时多日)。 请计算每位成员从起点到终点的最小耗时。 ---------------- #### 实现细节 需实现以下函数: ```cpp #include "escape_route.h" std::vector calculate_necessary_time( int N, int M, long long S, int Q, std::vector A, std::vector B, std::vector L, std::vector C, std::vector U, std::vector V, std::vector T ); ``` **参数说明**: - `N`:城市数量。 - `M`:道路数量。 - `S`:每日总皮秒数。 - `Q`:成员数量。 - `A`, `B`, `L`, `C`:长度为 $M$ 的数组,描述道路 $i$(连接 $A_i$ 与 $B_i$,耗时 $L_i$,检查开始时刻 $C_i$)。 - `U`, `V`, `T`:长度为 $Q$ 的数组,描述成员 $j$(从 $U_j$ 于时刻 $T_j$ 出发前往 $V_j$)。 **返回值**: - 长度为 $Q$ 的 `long long` 数组,其中 `answer[j]` 为成员 $j$ 的最小耗时。

输入格式

本题是交互题,详见**实现细节**。

输出格式

详见**实现细节**。

说明/提示

#### 样例解释 - **成员 $0$**(耗时 $3$ 皮秒): - 时刻 $5$:城市 $0$ → 道路 $1$(耗时 $2$)→ 城市 $2$(时刻 $7$)。 - 时刻 $7$:城市 $2$ → 道路 $4$(耗时 $1$)→ 城市 $3$(时刻 $8$)。 - **成员 $2$**(耗时 $14$ 皮秒): - 在城市 $0$ 等待至次日时刻 $0$。 - 时刻 $0$:城市 $0$ → 道路 $1$(耗时 $2$)→ 城市 $2$(时刻 $2$)。 - 时刻 $2$:城市 $2$ → 道路 $4$(耗时 $1$)→ 城市 $3$(时刻 $3$)。 #### 数据范围 - $2 \leq N \leq 90$ - $N(N-1) \leq M \leq \dfrac{N(N-1)}{2}$ - $2 \leq S \leq 10^{15}$ - $1 \leq Q \leq 3 \times 10^{6}$ - $0 \leq A_i, B_i, U_j, V_j \leq N-1$ - $A_i \neq B_i$,$U_j \neq V_j$ - $1 \leq L_i < S$,$L_i \leq C_i < S$ - $0 \leq T_j < S$ - 图连通 #### 子任务 1. ($5$ 分) $N \leq 40$,$Q \leq 1000$ 2. ($20$ 分) $N \leq 40$,所有 $U_j = 0$ 3. ($10$ 分) $N \leq 40$ 4. ($35$ 分) $N \leq 60$ 5. ($30$ 分) 无特殊限制 本翻译由 Deepseek R1 大模型生成。