P14038 [PAIO 2025] Adventure Plan

题目背景

**不要** $\texttt{\#include "adventure.h"}$。**使用 C++>=17** 提交。

题目描述

### 冒险计划 你正在为一次冒险做准备。这次冒险是在一个有向无环图(DAG)上的从起点到终点的旅程。该 DAG 有 $n$ 个顶点,编号为 $0$ 到 $n-1$,以及 $m$ 条边。起点是顶点 $0$,且所有顶点都可从起点到达。 每条从 $u_i$ 到 $v_i$ 的有向边都有两个属性:$l_i$ 和 $r_i$。它表示安全通过该边所需的最小和最大时间。因此,你可以为该边设定计划通过时间 $t_i$,满足 $t_i$ 是区间 $[l_i, r_i]$ 内的任意整数。 你的许多朋友也正在为冒险做准备。每个人都会选择一条不同的从起点到终点的路径。为了保证安全,你希望选择每条边的计划通过时间,使得从起点到任意顶点 $u$ 的所有路径消耗的总时间都相同。也就是说,希望对每个顶点 $u$,所有从起点到 $u$ 的路径,它们的总用时都一样。 我们称图满足上述要求时为“安全”的。保证初始的图是安全的。 ### 任务 1 你想向图中添加一些新边,使其更加有趣。你将执行 $q$ 次“添加新边”的操作。每次操作会给出一条新的有向边 $(u_i, v_i, l_i, r_i)$。你已知添加这条边后,图依然是有向无环图,但不确定图是否仍然安全。请判断添加该边后图是否安全。如果安全,就将该边添加到图中;否则,忽略这次操作。 ### 任务 2 所有操作结束后,你需要为每条边(包括新增边)输出一个计划通过时间 $t_i$,以证明你能确保新图依然安全。 ### 实现细节 你需要实现两个过程: 第一个过程是 `add_roads`: ```cpp boolean[] add_roads(int32 N, int32 M, int32 Q, int32[] U, int32[] V, int32[] L, int32[] R, int32[] U2, int32[] V2, int32[] L2, int32[] R2); ``` - $N$:顶点数; - $M$:初始边数; - $Q$:操作数; - $U, V$:长度为 $M$ 的数组,第 $i$ 条有向边为 $(U[i], V[i])$; - $L, R$:长度为 $M$ 的数组,第 $i$ 条边的可选时间区间为 $[L[i], R[i]]$; - $U2, V2, L2, R2$:长度为 $Q$ 的数组,描述每个新添加的边; - 本过程在每个测试用例开始时恰好调用一次。 本过程需返回一个长度为 $Q$ 的数组,第 $i$ 个元素为 true 当且仅当执行第 $i$ 次操作时将该边添加进图,否则为 false。 第二个过程是 `assign_times`: ```cpp int32[] assign_times(); ``` - 本过程在每个测试用例的 `add_roads` 调用结束后恰好调用一次。 本过程需返回一个数组,依次给出最终图中每条边的计划时间 $t_i$(输出顺序任意合法即可)。

输入格式

无特殊输入格式说明,见样例与题目描述。

输出格式

无特殊输出格式说明,见样例与题目描述。

说明/提示

### 样例 #### 样例 1 考虑如下调用: ```cpp add_roads(4, 4, 2, [0, 1, 0, 0], [1, 3, 3, 2], [1, 3, 9, 6], [5, 7, 14, 8], [2, 2], [3, 3], [7, 5], [11, 7]); ``` 该过程应返回 `[false, true]`。 在 `add_roads` 调用后,若输入: ```cpp assign_times(); ``` 应返回 `[5, 7, 12, 6, 6]`。 ### 样例评测器 样例评测器将输入数据读入格式如下: - 第 1 行:三个整数 $n, m, q$ - 接下来的 $m$ 行:每行四个整数 $u_i, v_i, l_i, r_i$,描述一条初始边 - 接下来的 $q$ 行:每行四个整数 $u_i, v_i, l_i, r_i$,描述一次操作 # 提示 - $3 \le n \le 500$ - $n-1 \le m \le 10^5$ - $0 \le q \le 500$ - $0 \le u_i < n$ - $1 \le l_i \le r_i \le 10^9$ # 评分 1. 子任务 1(7 分):$n \le 3$ 2. 子任务 2(21 分):$q = 0$ 3. 子任务 3(12 分):$v_i = u_i + 1$ 4. 子任务 4(11 分):$l_i = r_i$ 5. 子任务 5(24 分):$n \le 100, m \le 100, q \le 100$ 6. 子任务 6(25 分):无额外约束。 由 ChatGPT 5 翻译