QOJ.ac

QOJ

実行時間制限: 3 s メモリ制限: 1024 MB 満点: 100 コミュニケーション ハック可能 ✓

#18294. 桥梁建设计划

統計

这是一个交互式问题。

在 KSA 星球上有 $N$ 个岛屿。岛屿编号为 $1$ 到 $N$,岛屿 $i$ 拥有 $w_i$ 的资源量。任意两个不同岛屿的资源量均不相同。岛屿之间有 $N-1$ 条双向水下通道,保证任意两个岛屿之间仅通过水下通道即可互相到达。换句话说,岛屿和水下通道构成的结构是一棵树。

由于 KSA 星球上的水下通道在其他星球上不可见,KSA 星球的国王 Alice 计划额外建造 $N-1$ 条双向地面桥梁连接岛屿对。仅使用这些桥梁,也必须能够实现任意两个岛屿之间的通行。也就是说,桥梁结构也必须构成一棵树。

当 Alice 完成桥梁建设后,Automata 星球的国王 Bob 开始尝试获取信息。此时,岛屿编号被任意重新分配,从那时起,Bob 观察或使用的每个岛屿编号都遵循此重新分配后的编号系统。

Bob 必须仅通过观察 Alice 建造的地面桥梁来确定所有 $1 \le i, j \le N$ 的 $x(i, j)$,其中:

$x(i, j) = $ 在仅使用水下通道时,从岛屿编号 $i$ 到岛屿编号 $j$ 的唯一简单路径上,资源量最大的岛屿的编号。

此处,起始岛屿编号 $i$、目标岛屿编号 $j$ 以及资源量最大的岛屿编号均基于重新分配后的编号系统。从岛屿编号 $i$ 到岛屿编号 $j$ 的路径包含岛屿编号 $i$ 和岛屿编号 $j$。

在确定所有 $x(i, j)$ 的值之前,Bob 最多可以询问 $100$ 次以下问题以获取额外信息:

  • `?` $i$ $j$ :$x(i, j)$ 是多少?

由于星际通信非常昂贵,提问次数越少,得分越高。

你的程序在每个评测数据中会被执行两次。第一次执行时,它必须扮演 Alice 的角色;第二次执行时,它必须扮演 Bob 的角色。

第一行包含一个整数 $S$,表示执行步骤。$S=1$ 表示扮演 Alice,$S=2$ 表示扮演 Bob。

Alice 的角色

输入格式:输入包含一个或多个测试用例。第二行包含测试用例数量 $T$。每个测试用例格式如下:

第一行包含岛屿数量 $N$。

第二行包含 $N$ 个空格分隔的整数 $w_1, w_2, \cdots, w_N$。

接下来的 $N-1$ 行,每行包含两个空格分隔的整数 $u, v$,表示一条水下通道的两个端点。

输出格式:输出 $N-1$ 行,每行包含两个空格分隔的整数 $u, v$,表示要建造的一条地面桥梁的两个端点。打印桥梁的顺序无关紧要,每条桥梁中两个端点的顺序也无关紧要。

Bob 的角色

交互:输入包含一个或多个测试用例。第二行包含测试用例数量 $T$。每个测试用例格式如下:

第一行包含岛屿数量 $N$。

接下来的 $N-1$ 行,每行包含两个空格分隔的整数 $u, v$,表示 Alice 建造的一条地面桥梁的两个端点。注意,$u$ 和 $v$ 使用的是重新分配后的编号系统,且 Bob 接收到的桥梁顺序可能与 Alice 打印的顺序不同。

如需获取额外信息,当打印以下查询时,下一行将包含 $x(i, j)$ 的值。此查询在每个测试用例中最多可使用 $100$ 次:

  • `?` $i$ $j$ ($1 \le i, j \le N$)

提交答案时,打印 `!` ,然后在接下来的 $N$ 行中打印答案。在 $N$ 行中的第 $i$ 行,必须打印 $x(i, 1), x(i, 2), \cdots, x(i, N)$,并用空格分隔。此查询不计入提问次数,且相应测试用例的交互在打印后立即结束。

如果当前测试用例不是最后一个,交互结束后必须立即进入下一个测试用例。如果最后一个测试用例的交互结束,程序必须立即终止。

然而,如果在单个测试用例中提问次数超过 $100$ 次,查询的响应将给出 `-1` ,表示超过了允许的提问次数。在这种情况下,你的程序必须立即终止,结果将被判定为 Wrong Answer。

约束

  • $S \in \{1, 2 \}$
  • $1 \le T \le 100$
  • $2 \le N \le 100$
  • $1 \le u < v \le N$
  • $1 \le w_i \le 10^9$
  • 若 $i \ne j$,则 $w_i \neq w_j$

评分标准

对于每个评测数据,设 $Q$ 为所有测试用例中提问次数的最大值。该评测数据的得分判定如下:

| :---: | :---: | :---: | | 编号 | 分数 | 约束 | | 1 | 25 | $60 < Q \le 100$ | | 2 | 37 | $20 < Q \le 60$ | | 3 | 50 | $4 < Q \le 20$ | | 4 | 62 | $Q = 4$ | | 5 | 75 | $Q = 3$ | | 6 | 100 | $Q \le 2$ |

你的提交得分为所有评测数据中的最低得分。但是,如果你没有在题目规定的限制内通过正确的交互打印解决方案,可能会出现意外结果。

样例

输入格式 1

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

2
10 1
1 2

输出格式 1

1 4
2 3
3 4

1 2

输入格式 2

2
2
4
1 3
1 4
2 3

4

1

2

1 2

2

输出格式 2

? 2 3

? 1 2

!
1 1 1 1
1 2 4 4
1 4 3 4
1 4 4 4

? 1 2

!
1 2
2 2

说明

在样例 1 中,由于 $S = 1$,你的程序必须扮演 Alice 的角色。

在样例 2 中,由于 $S = 2$,你的程序必须扮演 Bob 的角色。

在第一个测试用例中,第一次执行时的顶点 $1, 2, 3, 4$ 被重新分配为顶点 $2, 4, 1, 3$。

在第二个测试用例中,第一次执行时的顶点 $1, 2$ 被重新分配为顶点 $2, 1$。

打印内容后必须立即刷新输出。刷新方法如下:

  • C --- `fflush(stdout)`
  • C++ --- `std::cout.flush()`
  • Python --- `sys.stdout.flush()`
  • Java --- `System.out.flush()`
  • 其他语言请查阅相关文档。

此外,请注意样例输入和输出中的空行仅为了清晰起见,在实际交互中不会出现。

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.