JOI 岛是一个观光区,整个岛屿被指定为自然公园。
JOI 岛上有 $N$ 个地点和若干条道路。地点编号为 $0$ 到 $N - 1$。每条道路连接两个不同的地点,且可以双向通行。对于每个地点,最多有 $7$ 条道路与其他地点相连。对于任意两个不同的地点,至多只有一条道路直接相连。从任何一个地点出发,通过若干条道路,都可以到达其他任何地点。
你和你的朋友 IOI-chan 将对 JOI 岛进行考察。为了高效地进行考察,你需要弄清楚 JOI 岛的结构。由于 JOI 岛上有很多野生动物,环境十分危险。鉴于 IOI-chan 拥有极高的运动能力,她将负责探索 JOI 岛,而你将根据 IOI-chan 的报告来确定 JOI 岛的结构。
你可以向 IOI-chan 提供两个地点 $A$ 和 $B$ 以及若干个可能的中间地点,并询问她:如果仅允许通过给定的中间地点,是否可以从地点 $A$ 到达地点 $B$。随后,IOI-chan 将探索 JOI 岛并将结果报告给你。
由于考察时间有限,询问次数必须小于或等于 $45\,000$ 次。
任务
编写一个程序,与 IOI-chan 进行通信并确定 JOI 岛的结构。
实现细节
你需要编写一个程序来实现确定 JOI 岛结构的方法。你的程序必须包含 park.h。
你的程序需要实现以下函数:
void Detect(int T, int N)
该函数仅被调用一次。 * 参数 $T$ 是子任务编号,$N$ 是地点数量。
你的程序应使用以下函数输出确定的 JOI 岛结构:
void Answer(int A, int B)
该函数的调用次数应与 JOI 岛上的道路数量相同。 * 参数 $A, B$ 表示地点 $A$ 和地点 $B$ 之间有一条道路。
参数应满足以下条件: $A, B$ 应满足 $0 \le A < B \le N - 1$。如果不满足此条件,你的程序将被判定为 Wrong Answer[1]。 如果函数调用参数为 $(A, B)$,则地点 $A$ 和地点 $B$ 之间必须存在一条道路。如果不满足此条件,你的程序将被判定为 Wrong Answer[2]。 * 对于相同的参数 $(A, B)$,该函数不得调用超过一次。如果不满足此条件,你的程序将被判定为 Wrong Answer[3]。
此外,你的程序可以调用以下函数:
int Ask(int A, int B, int Place[])
该函数用于向 IOI-chan 提问。
Place 是一个指向可能中间地点数组的指针。对于每个 $i$ ($0 \le i \le N - 1$),Place[i] = 1 表示可以通过地点 $i$,Place[i] = 0 表示不能通过地点 $i$。
如果仅允许通过数组 Place[] 指定的地点,且可以从地点 $A$ 到达地点 $B$,则该函数返回 $1$。否则,返回 $0$。
参数应满足以下条件:
$0 \le A < B \le N - 1$。
$0 \le Place[i] \le 1$ ($0 \le i \le N - 1$)。
Place[A] = 1。
Place[B] = 1。
如果不满足这些条件,你的程序将被判定为 Wrong Answer[4]。如果数组 Place[] 的长度不等于 $N$,则函数的行为是不确定的。
Ask 函数的调用次数不得超过 $45\,000$ 次。如果超过此限制,你的程序将被判定为 Wrong Answer[5]。
当 Detect 函数终止时,如果存在一条道路未被作为 Answer 函数的参数调用过,你的程序将被判定为 Wrong Answer[6]。
你的程序可以实现其他函数供内部使用,或使用全局变量。你的程序不应使用标准输入和标准输出。你的程序不应通过任何方式与其他文件通信。
编译与运行
你可以从竞赛网页下载包含样例评测程序的压缩包来测试你的程序。压缩包中还包含一个样例源文件。
样例评测程序由一个源文件组成,即 grader.c 或 grader.cpp。例如,如果你的程序是 park.c 或 park.cpp,你可以运行以下命令来编译你的程序:
- C
gcc -std=c11 -O2 -o grader grader.c park.c -lm - C++
g++ -std=c++14 -O2 -o grader grader.cpp park.cpp
编译成功后,将生成可执行文件 grader。
注意,实际的评测程序与样例评测程序不同。样例评测程序将作为一个单独的进程执行,它会从标准输入读取数据并将结果写入标准输出。
样例评测程序的输入格式
样例评测程序从标准输入读取以下数据:
- 第一行包含一个整数 $T$,即子任务编号。
- 第二行包含一个整数 $N$,即地点数量。
- 第三行包含一个整数 $M$,即道路数量。
- 接下来的 $M$ 行中,第 $i$ 行 ($1 \le i \le M$) 包含两个空格分隔的整数 $A_i, B_i$。这意味着地点 $A_i$ 和地点 $B_i$ 之间有一条道路,且可以双向通行。
样例评测程序的输出格式
当程序成功终止时,样例评测程序会将以下信息写入标准输出。(引号不包含在实际输出中。)
- 如果你的程序被判定为正确,样例评测程序会输出 “Accepted.”。
- 如果你的程序被判定为 Wrong Answer,样例评测程序会以 “Wrong Answer [1]” 的形式输出错误类型,并终止你的程序。
如果你的程序被判定为多种类型的 Wrong Answer,样例评测程序仅报告其中一种。
数据范围
所有输入数据均满足以下条件。关于 $T, N, M$ 的含义,请参阅“样例评测程序的输入格式”。
- $1 \le T \le 5$
- $2 \le N \le 1\,400$
- $1 \le M \le 1\,500$
- 对于每个地点,最多有 $7$ 条道路与其他地点相连。
- 从任何一个地点出发,通过若干条道路,都可以到达其他任何地点。
- 对于任意两个不同的地点,至多只有一条道路直接相连。
子任务
共有 $5$ 个子任务。各子任务的分数和附加限制如下:
子任务 1 [10 分]
- $T = 1$。
- $N \le 250$。
子任务 2 [10 分]
- $T = 2$。
- $M = N - 1$。
- 对于地点 $0$ 或 $N - 1$,恰好有一条道路与其他地点相连。对于其他所有地点,恰好有 $2$ 条道路与其他地点相连。
子任务 3 [27 分]
- $T = 3$。
- $M = N - 1$。
- 对于每个 $i$ ($1 \le i \le N - 1$),如果最多经过 $8$ 个其他地点,则可以从地点 $0$ 到达地点 $i$。
子任务 4 [30 分]
- $T = 4$。
- $M = N - 1$。
子任务 5 [23 分]
- $T = 5$。
样例
以下是样例评测程序的输入示例及相应的函数调用。
输入格式 1
1 6 7 0 1 0 3 1 2 1 4 2 4 2 5 3 4
输出格式 1
Accepted.
说明
在此示例中,Detect 函数被调用时参数为 $T = 1, N = 6$。
在此示例中,JOI 岛的结构如下:
JOI 岛的结构。圆圈和数字表示地点及其编号。线段表示道路。
- 第一次调用
Ask函数询问是否可以在仅允许通过地点 $2, 3, 4, 5$ 的情况下从地点 $3$ 到达地点 $5$。因为这是可能的,所以Ask函数返回 $1$。 - 第二次调用
Ask函数询问是否可以在仅允许通过地点 $0, 2, 4$ 的情况下从地点 $0$ 到达地点 $4$。因为这是不可能的,所以Ask函数返回 $0$。