CF2001C Guess The Tree

题目描述

这是一道交互题。 Misuki 有一棵结构未知,具有 $n$ 个节点的树,节点编号从 $ 1 $ 到 $ n $ ,并要求你写一份代码来猜测它。 你可以询问以下问题: `? a b` 其中 $a,b$ 为两个节点的编号。 对于一次询问,Misuki 会告诉你哪个节点 $x$ 能最小化 $|d(a,x)-d(b,x)|$ 的值,其中 $d(x,y)$ 是节点 $x$ 和 $y$ 之间的距离。如果存在多个这样的节点,Misuki 会告诉你最小化 $d(a,x)$ 的节点。 现要求你使用不超过 $15n$ 次的询问,来确定这棵树的结构。

输入格式

**本题有多组测试数据。** 第一行一个正整数 $t$ ,代表测试样例的个数,$1 \le t \le 200 $。 对于每组测试数据,一行一个正整数 $n$($2 \le n \le 1000$),代表树中的节点数。 保证所有测试数据中 $n$ 的总和不超过 $1000$。

输出格式

交互从读取整数 $n$ 开始, 然后你最多可以进行 $15n$ 次查询。在每个查询后,读取一个整数作为查询的答案。 要输出答案,请按如下格式输出: !$a_1$ $b_1$ $a_2$ $b_2$ ... $a_{n-1}$ $b_{n-1}$ 这意味着对于 $1 \le i \le n-1$,节点 $ a_i $ 和 $ b_i $ 之间有一条边。你可以按任意顺序输出边。 在进行 $15n$ 次查询后,若再进行查询,将读取到 $-1$ 。收到 $-1$ 后,请终止程序以接收 Wrong Answer 判定。

说明/提示

打印每一行后(即进行一次询问或输出一次答案后),请输出回车并刷新输出缓冲区。可刷新输出缓冲区的有: - C++ 中的 `fflush(stdout)` 或 `cout.flush()`; - Java 中的 `System.out.flush()`; - Pascal 中的 `flush(output)`; - Python 中的 `stdout.flush()`; - 对于其他语言,请参阅其他语言的文档。 Translated by @[ARIS2_0](https://www.luogu.com.cn/user/1340759)