P10440 [JOIST 2024] 环岛旅行 / Island Hopping
题目背景
**由于部分 BUG,使用 C++14 (GCC9) 提交会产生编译错误,请使用 C++14 等语言进行提交。**
**题目译自 [JOISC 2024](https://www2.ioi-jp.org/camp/2024/2024-sp-tasks/index.html) Day4 T2 「[島巡り](https://www2.ioi-jp.org/camp/2024/2024-sp-tasks/contest4/island.pdf) / [Island Hopping](https://www2.ioi-jp.org/camp/2024/2024-sp-tasks/contest4/island-en.pdf)」**。翻译来源 LOJ。
**不要引入 `island.h`**。你应该在文件头添加以下声明:
```
int query(int, int);
void answer(int, int);
```
交互文件可在 [JOI 官网](https://www2.ioi-jp.org/camp/2024/2024-sp-tasks/index.html)下载。
题目描述
**这是一道交互题。本题交互库是非自适应的。**
JOI 国有 $N$ 座岛屿,编号为 $1$ 到 $N$。有 $N-1$ 条航线,编号为 $1$ 到 $N-1$。航线 $j\ (1\le j\le N-1)$ 双向连接岛屿 $A_j$ 和 $B_j$。可以从一座岛屿出发,通过一些航线到达任意另一个岛屿。
葵准备在 JOI 国旅行。然而她不知道 JOI 国的航线。她准备向 JOI 国居住的 Bitaro 按下面的方式提一些问题:
1. 葵告诉 Bitaro 两个整数 $v$ 和 $k$,其中 $1\le v\le N,1\le k\le N-1$。
2. Bitaro 会告诉她除了 $v$ 之外的其他 $N-1$ 座岛屿中,距离 $v$ 第 $k$ 近的岛屿编号。更确切地说,他会告诉她一个整数 $i$,满足 $\text{dist}(v,i)\times N+i\ (1\le i\le N,i\neq v)$ 是第 $k$ 小的,其中 $\text{dist}(v,i)$ 是从岛屿 $v$ 到 $i$ 所经过的最小航线数。
葵想通过提问知道所有 JOI 国的航线。因为葵不想花费太多时间,所以她最多只能向 Bitaro 问 $L$ 个问题。
给定 JOI 国的岛屿数和提问限制数,写一个程序模拟葵的提问策略,以找出所有的航线。
### 实现细节
你需要在程序开头引入库 `island.h`。
你需要实现如下函数。
- `void solve(int N, int L)`
此函数在每个测试点中只被调用一次
- 参数 `N` 是岛屿数 $N$
- 参数 `L` 是提问次数限制 $L$。
在程序中,你可以调用如下函数。
- `int query(int v, int k)`
葵使用此函数向 Bitaro 提问
- 参数 `v` 必须在 $1$ 到 $N$ 之间。如果不是,你的程序会被判为 **Wrong Answer [1]**。
- 参数 `k` 必须在 $1$ 到 $N-1$ 之间。如果不是,你的程序会被判为 **Wrong Answer [2]**。
- 返回值表示除 $v$ 之外的其他 $N-1$ 个岛屿中,距离 $v$ 第 $k$ 近的岛屿编号。参考题目描述获得更详细的定义。
- 你不能调用 `query` 函数超过 $L$ 次,否则你的程序会被判为 **Wrong Answer [3]**。
- `void answer(int x, int y)`
使用此函数回答 JOI 国的一条航线
- 参数 `x` 和 `y` 表示被一条航线连接的两座岛屿。
- 参数 `x` 和 `y` 必须在 $1$ 到 $N$ 之间。如果不是,你的程序会被判为 **Wrong Answer [4]**。
- 必须存在一条连接岛屿 `x` 和 `y` 的航线。换句话说,必须存在一个整数 $j\ (1\le j\le N-1)$ 满足 $x=A_j,y=B_j$ 或 $x=B_j,y=A_j$。否则,你的程序会被判为 **Wrong Answer [5]**。
- 你的程序不能回答相同的航线两次或以上。否则,你的程序会被判为 **Wrong Answer [6]**。
- 函数 `answer` 必须被调用恰好 $N-1$ 次。如果 `solve` 函数运行结束后此函数调用次数不是 $N-1$,你的程序会被判为 **Wrong Answer [7]**。
### 注意事项
- 你的程序可以实现其它函数供内部使用,或者使用全局变量。
- 你的程序禁止使用标准输入输出。你的程序禁止与其他文件通过任何方式交互。然而,你的程序可以使用标准错误输出输出调试信息。
- 测评中使用的交互器**不是**自适应性的。这意味着每组测试点的答案是提前确定好的。
### 编译运行
你可以在附件中下载样例交互器来测试你的程序。附加文件中还包含一个样例程序。
样例交互器是文件 `grader.cpp`。为了测试你的程序,请将 `grader.cpp`,`island.cpp` 和 `island.h` 放在同一目录下,并且执行如下命令编译程序。此外你也可以运行 `compile.sh` 来编译你的程序。
```bash
g++ -std=gnu++20 -O2 -o grader grader.cpp island.cpp
```
当编译成功时,会生成可执行文件 `grader`。
注意测评时使用的交互器与样例交互器不同。样例交互器会以单进程的形式执行,它会从标准输入中读入数据,输出结果到标准输出。
输入格式
Sample Grader 输入格式如下:
第一行两个整数 $N,L$。
接下来 $N-1$ 行,每行两个整数 $A_j,B_j$。
输出格式
样例交互器将向标准输出中输出如下信息:
- 如果你的程序被判为正确,它会报告调用 `query` 的次数,如:`Accepted: 2024`。
- 如果你的程序被判为某种 Wrong Answer,样例交互程序会输出它的类别,如:`Wrong Answer [4]`。
如果你的程序满足多种 Wrong Answer 的类别,样例交互器只会报告其中一个。
说明/提示
### 样例交互
#### 样例交互 $1$
样例调用过程如下表所示。
| 调用 | 调用 | 返回值 |
| :------------: | :------------: | :----: |
| `solve(4, 16)` | | |
| | `query(2, 1)` | $1$ |
| | `query(3, 1)` | $4$ |
| | `answer(2, 4)` | |
| | `query(2, 2)` | $4$ |
| | `answer(2, 1)` | |
| | `query(3, 2)` | $2$ |
| | `query(2, 1)` | $1$ |
| | `answer(3, 4)` | |
从岛屿 $2$ 到岛屿 $1,3,4$ 的最小经过航线数分别为 $1,2,1$。例如,从岛屿 $2$ 到岛屿 $3$,我们可以使用航线 $2$ 后使用航线 $3$。
将岛屿按 $\text{dist}(2,i)\times N+i\ (i\neq 2)$ 递增的顺序排序,结果是岛屿 $1,4,3$。因此,`query(2, 1)` 的返回值为 $1$,`query(2, 2)` 的返回值为 $4$。
样例 $1$ 满足子任务 $2,6$ 的限制。
#### 样例交互 $2$
样例调用过程如下表所示。
| 调用 | 调用 | 返回值 |
| :------------: | :------------: | :----: |
| `solve(5, 25)` | | |
| | `query(1, 3)` | $5$ |
| | `query(1, 4)` | $2$ |
| | `answer(3, 1)` | |
| | `query(2, 4)` | $4$ |
| | `query(3, 1)` | $1$ |
| | `query(3, 2)` | $4$ |
| | `answer(1, 5)` | |
| | `answer(4, 1)` | |
| | `answer(2, 5)` | |
从岛屿 $1$ 到岛屿 $2,3,4,5$ 的最小经过航线数分别为 $2,1,1,1$。例如,从岛屿 $1$ 到岛屿 $2$,我们可以使用航线 $4$ 后使用航线 $1$。
将岛屿按 $\text{dist}(1,i)\times N+i\ (i\neq 1)$ 递增的顺序排序,结果是岛屿 $3,4,5,2$。因此,`query(1, 3)` 的返回值为 $5$,`query(1, 4)` 的返回值为 $2$。
样例 $2$ 满足子任务 $4,6$ 的限制。
### 数据范围
- $3\le N\le 300$
- $1\le A_j,B_j\le N\ (1\le j\le N-1)$
- $A_j\neq B_j\ (1\le j\le N-1)$
- 可以通过航线,从一个岛屿到达任意其他岛屿
### 子任务
| 子任务 | 附加限制 | 分值 |
| :----: | :----------------------------------------------------------: | :--: |
| $1$ | $N=3,L=9$ | $2$ |
| $2$ | $L=N^2$,每座岛屿最多有两条航线连接 | $4$ |
| $3$ | $L=2N$,每座岛屿最多有两条航线连接 | $7$ |
| $4$ | $L=N^2$,岛屿 $1$ 有三条航线连接,其他每座岛屿最多有两条航线连接 | $9$ |
| $5$ | $L=3N$,岛屿 $1$ 有三条航线连接,其他每座岛屿最多有两条航线连接 | $13$ |
| $6$ | $L=N^2$ | $15$ |
| $7$ | $L=3N$ | $22$ |
| $8$ | $L=2N$ | $28$ |