QOJ.ac

QOJ

时间限制: 1 s 内存限制: 256 MB 总分: 100 通信

#1212. 导航

统计

Anna 是 IOI 群岛的居民,她决定邀请朋友 Bruno 来 IOI 群岛游玩。IOI 群岛由 $N$ 个岛屿组成,编号为 1 到 $N$。此外,IOI 群岛有 $N-1$ 座桥,编号为 0 到 $N-2$。桥 $i$ 双向连接岛 $A_i$ 和岛 $B_i$。此外,从任何一个岛屿都可以通过桥到达其他所有岛屿。Anna 的家在岛 $T$ 上,但 Bruno 不知道 Anna 家所在的岛屿编号。

为了帮助 Bruno,Anna 决定在每个岛屿上竖立一面旗帜,并在每面旗帜上写下一个整数。Anna 不知道 Bruno 会到达哪个岛屿。

Bruno 乘船到达岛 $S$。当 Bruno 到达岛 $S$ 时,他会获得以下信息: 到达的岛屿编号 $S$,以及岛 $S$ 上旗帜所写的整数。 所有与岛 $S$ 直接通过桥相连的岛屿编号,以及这些岛屿上旗帜所写的整数。

当 Bruno 从岛 $S$ 前往岛 $T$ 时,他必须走经过桥数量最少的路径。 Bruno 能否仅凭他获得的信息,判断他到达的岛屿 $S$ 是否就是 Anna 的家所在的岛屿 $T$,并在 $S$ 与 $T$ 不同时,正确选择下一个要前往的岛屿呢?

任务

给定 IOI 群岛的信息,编写一个程序来实现 Anna 的策略,即在岛屿上竖立写有整数的旗帜。此外,编写一个程序来实现 Bruno 的策略,即根据到达岛屿时获得的信息,正确选择下一步行动。

实现细节

你必须使用同一种编程语言提交两个文件。

第一个文件名为 Anna.cAnna.cpp。该文件实现了 Anna 的策略,必须实现以下例程:

  • void Anna(int K, int N, int T, int A[], int B[])

该例程在程序开始时仅被调用一次。 参数 K 是子任务编号 K 参数 N 是 IOI 群岛的岛屿数量 N 参数 T 是 Anna 家所在的岛屿编号 T 参数 AB 是长度为 $N-1$ 的数组。元素 A[i]B[i] 表示桥 $i$ 连接岛 A[i]B[i] ($0 \le i \le N-2$)。

此外,必须调用以下例程在岛屿上竖立旗帜:

  • void Flag(int I, int V)

  • 参数 I 表示 Anna 竖立旗帜的岛屿编号。

  • 参数 V 表示 Anna 在旗帜上写的整数。

注意,Flag 的调用必须满足以下条件: I 必须是 1 到 $N$ 之间的整数。如果不满足,则判为不正确 [1]。 不能使用相同的 I 调用 Flag 两次或以上。如果不满足,则判为不正确 [2]。 V 必须是 0 到 $N$ 之间的整数。如果不满足,则判为不正确 [3]。 Flag 必须恰好被调用 $N$ 次。如果不满足,则判为不正确 [4]。

如果 Flag 的调用被判定为不正确,程序执行将立即终止。

第二个文件名为 Bruno.cBruno.cpp。该文件实现了 Bruno 的策略,必须实现以下例程:

  • void Bruno(int K, int S, int F, int L, int P[], int Q[])

该例程在 Anna 被调用后仅被调用一次。 参数 K 是子任务编号 K 参数 S 是 Bruno 到达的岛屿编号 S 参数 F 是岛 S 上旗帜所写的整数。 参数 L 是与岛 S 直接通过桥相连的岛屿数量 L 参数 P 是长度为 L 的数组,包含与岛 S 直接相连的岛屿编号。 参数 Q 是长度为 L 的数组,元素 Q[j] 表示岛 P[j] 上旗帜所写的整数 ($0 \le j \le L-1$)。

此外,必须调用以下例程来判断 Bruno 到达的岛屿 $S$ 是否有 Anna 的家,如果不是,则必须正确选择下一个要前往的岛屿:

  • void Answer(int X)

  • 参数 X 是:如果 Bruno 到达的岛屿上有 Anna 的家,则为 Anna 家所在的岛屿编号 T;否则,为 Bruno 下一个要前往的岛屿编号。

注意,Answer 的调用必须满足以下条件: 参数 X 必须是数组 P 的元素之一,或者为 S。如果不满足,则判为不正确 [5]。 如果 Answer 被调用两次或以上,则判为不正确 [6]。 如果没有调用 Answer,则判为不正确 [7]。 如果岛 S 上有 Anna 的家,但参数 X 不为 T,则判为不正确 [8]。 * 如果岛 S 上没有 Anna 的家,但参数 X 不是下一个要前往的岛屿,则判为不正确 [9]。

Bruno 例程被调用后,将进行答案判定。

你可以自由实现其他例程或声明全局变量以供内部使用。但是,由于提交的两个程序将与评分程序链接在一起成为一个可执行文件,因此必须将每个文件中的所有全局变量和内部例程声明为 static,以避免与其他文件产生冲突。在评分时,该程序将作为 Anna 侧和 Bruno 侧两个进程运行,因此 Anna 侧和 Bruno 侧无法共享程序中的全局变量。 你的提交不得以任何方式与标准输入、标准输出或其他文件进行交互。

数据范围

所有输入数据满足以下条件: $2 \le N \le 100\,000$ $1 \le S \le N$ $1 \le T \le N$ $1 \le A_i \le N$ ($0 \le i \le N-2$) $1 \le B_i \le N$ ($0 \le i \le N-2$) $1 \le K \le 4$ * 从 IOI 群岛的任何岛屿都可以通过桥到达所有其他岛屿。

子任务

子任务 1 [10 点]

  • 满足 $K = 1$。

子任务 2 [15 点]

  • 满足 $K = 2$。
  • 传递给 Flag 的参数 V 的值必须在 0 到 2 之间。

子任务 3 [20 点]

  • 满足 $K = 3$。
  • 传递给 Flag 的参数 V 的值必须为 0 或 1。
  • 不存在恰好与 2 个岛屿通过桥直接相连的岛屿。
  • 满足 $S \neq T$。

子任务 4 [55 点]

  • 满足 $K = 4$。
  • 传递给 Flag 的参数 V 的值必须为 0 或 1。

样例

输入格式 1

5 3 2 1
1 3
3 2
3 4
4 5
2

输出格式 1

Accepted : V_max = 1

说明

此样例展示了交互过程。对于 AnnaBruno 函数的调用参数如下:

Anna 调用参数: * $K=1, N=5, T=2, A=\{1, 3, 3, 4\}, B=\{3, 2, 4, 5\}$

Bruno 调用参数: * $K=1, S=3, F=0, P=\{2, 1, 4\}, Q=\{1, 1, 0\}$

注意:此例中 Flag 的调用不一定具有实际意义。

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
EditorialOpen Official EditorialQingyu- Download

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.