P11237 [KTSC 2024 R1] 警察与小偷
题目背景
**请勿使用 C++14 (GCC 9) 提交**。
你需要在程序开头加入如下代码:
```cpp
#include
#include
std::vector police_thief(std::vector A, std::vector B, std::vector D, std::vector P, std::vector V1, std::vector T, std::vector V2);
```
题目描述
**题目译自 [2024년도 국제정보올림피아드 대표학생 선발고사 - 1차 선발고사](https://www.ioikorea.kr/archives/ioitst/2024/) T3 「[경찰과 도둑](https://assets.ioikorea.kr/ioitst/2024/1/police/police_statement.pdf)」**
KOI 村由 $N$ 座房子和连接这些房子的 $N-1$ 条双向道路组成。任意两座不同的房子都可以通过这些道路互相到达。也就是说,KOI 村的道路网络是一个树结构。
KOI 村的房子编号从 $0$ 到 $N-1$,道路编号从 $0$ 到 $N-2$。对于编号为 $i$ 的道路,它连接了编号为 $A[i]$ 和 $B[i]$ 的房子,长度为 $D[i]$ 米。
最近,KOI 村频繁发生盗窃事件,村民们非常困扰。为了应对这种情况,村里决定在某个房子里安排警察待命,以便在小偷出现时迅速抓捕。村民们想知道在不同情况下,警察需要多长时间才能抓住小偷。
你将会得到 $Q$ 个场景,每个场景编号从 $0$ 到 $Q-1$。每个场景如下:
- 在第 $j$ 个场景中,警察从编号为 $P[j]$ 的房子出发,最大速度为 $V1[j]$ 米/秒。
- 在第 $j$ 个场景中,小偷从编号为 $T[j]$ 的房子出发,最大速度为 $V2[j]$ 米/秒。
- 警察和小偷出发的房子不同,即 $P[j] \neq T[j]$。
- 房子的大小可以忽略不计,因此可以将房子视为一个点。道路的宽度也可以忽略不计,因此可以将道路视为一条线段。道路之间不相交。
- 警察和小偷可以在 KOI 村内自由移动,速度不超过各自的最大速度。可以选择不移动。
- 如果警察和小偷在同一个位置,警察就能抓住小偷。这个位置可以是房子,也可以是道路的中间。
- 在每个场景中,警察和小偷都知道对方的速度,并且随时知道对方的位置。
- 警察和小偷都会采用最优策略。警察会尽快抓住小偷,而小偷会尽量拖延被抓住的时间。可以证明,在最优策略下,小偷一定会在有限时间内被抓住。
你需要计算每个场景中,小偷被抓住所需的时间。
你需要实现以下函数:
```cpp
std::vector police_thief(std::vector A, std::vector B, std::vector D, std::vector P, std::vector V1, std::vector T, std::vector V2);
```
- `A, B, D`:大小为 $N-1$ 的整数数组。对于每条编号为 $i$ 的道路,它连接了编号为 $A[i]$ 和 $B[i]$ 的房子,长度为 $D[i]$ 米。
- `P, V1, T, V2`:大小为 $Q$ 的整数数组。对于第 $j$ 个场景,警察从编号为 $P[j]$ 的房子出发,最大速度为 $V1[j]$ 米/秒,小偷从编号为 $T[j]$ 的房子出发,最大速度为 $V2[j]$ 米/秒。
- 该函数返回一个大小为 $Q$ 的数组 $C$,每个元素是一个大小为 $2$ 的数组。对于第 $j$ 个场景,小偷被抓住所需的时间(以秒为单位)表示为分数 $C[j][0] / C[j][1]$。
- $C[j][0] / C[j][1]$ 可以不是最简分数,但 $C[j][0]$ 和 $C[j][1]$ 必须是 $1$ 到 $10^{18}$ 之间的整数。可以证明,对于所有满足约束条件的输入,答案总能表示为这种形式的分数。
注意,提交的代码中不应包含任何输入输出操作。
输入格式
示例评测程序按以下格式读取输入:
- 第 $1$ 行:$N\,Q$
- 第 $2+i$ $(0 \leq i \leq N-2)$ 行:$A[i]\,B[i]\,D[i]$
- 第 $1+N+j$ $(0 \leq j \leq Q-1)$ 行:$P[j]\,V1[j]\,T[j]\,V2[j]$
输出格式
示例评测程序按以下格式读取输入:
- 第 $1$ 行:$N\,Q$
- 第 $2+i$ $(0 \leq i \leq N-2)$ 行:$A[i]\,B[i]\,D[i]$
- 第 $1+N+j$ $(0 \leq j \leq Q-1)$ 行:$P[j]\,V1[j]\,T[j]\,V2[j]$
假设 `police_thief` 返回的数组为 $C$。示例评测程序将输出:
- 第 $1+j$ $(0 \leq j \leq Q-1)$ 行:$C[j][0]\,C[j][1]$
说明/提示
对于所有输入数据,满足:
- $2 \leq N \leq 10^5$
- $1 \leq Q \leq 10^5$
- 对于所有 $i$ $(0 \leq i \leq N-2)$,$0 \leq A[i], B[i] \leq N-1$ 且 $A[i] \neq B[i]$
- 对于所有 $i$ $(0 \leq i \leq N-2)$,$1 \leq D[i] \leq 10^6$
- KOI 村是一棵树的结构
- 对于所有 $j$ $(0 \leq j \leq Q-1)$,$0 \leq P[j], T[j] \leq N-1$ 且 $P[j] \neq T[j]$
- 对于所有 $j$ $(0 \leq j \leq Q-1)$,$1 \leq V1[j], V2[j] \leq 10^6$
详细子任务附加限制及分值如下表所示。
| 子任务 | 分值 | 附加限制 |
| :-: | :-: | :-: |
| $1$ | $15$ | $N \leq 5000, Q \leq 5000$ |
| $2$ | $21$ | $N \leq 50000,Q \leq 50000$ |
| $3$ | $5$ | 对于所有 $i$ $(0 \leq i \leq N-2)$,$A[i]=i, B[i]=i+1$ |
| $4$ | $6$ | 对于所有 $i$ $(0 \leq i \leq N-2)$,$A[i]=0, B[i]=i+1$ |
| $5$ | $14$ | 对于所有 $j$ $(0 \leq j \leq Q-1)$,$V1[j] \leq V2[j]$ |
| $6$ | $9$ | 对于所有 $j$ $(0 \leq j \leq Q-1)$,$P[j]$ 和 $T[j]$ 之间的道路数量不超过 $10$ 条 |
| $7$ | $9$ | 对于所有 $j$ $(0 \leq j \leq Q-1)$,$P[j]=0$ |
| $8$ | $10$ | 对于所有 $j$ $(0 \leq j \leq Q-1)$,$T[j]=0$ |
| $9$ | $11$ | 无附加限制 |