CF1129E Legendary Tree
题目描述
这是一个交互题。
一棵传说中的树静静地矗立在森林深处。传说中,能够识破这棵树的人将永远成为传说中的宗师。
为了帮助你确定这棵树,女神 Mikaela 向你透露,这棵树包含 $n$ 个顶点,编号从 $1$ 到 $n$。她还允许你向她提出如下问题。对于每个问题,你需要告诉 Mikaela 两个不相交且非空的顶点集合 $S$ 和 $T$,以及你喜欢的任意一个顶点 $v$。然后,Mikaela 会统计并告诉你有多少对顶点 $(s, t)$ 满足 $s \in S$ 且 $t \in T$,并且从 $s$ 到 $t$ 的简单路径经过 $v$。
女神 Mikaela 很忙,她最多只会回答你 $11\,111$ 个问题。
这是你唯一的机会。你的任务是确定这棵树,并报告它的所有边。
输入格式
第一行包含一个整数 $n$($2 \leq n \leq 500$),表示树的顶点数。
输出格式
当你确定了树并准备报告所有边时,单独输出一行 "ANSWER"(全部大写字母)。
接下来输出 $n-1$ 行,每行包含两个用空格分隔的整数,表示一条边的两个端点。每条边只需报告一次。输出完毕后,程序应立即终止。
## 交互说明
每当你想要询问一个问题时,请按如下方式与评测机交互:
1. 首先输出 $S$ 的大小,单独占一行。下一行输出 $|S|$ 个用空格分隔的不同整数,表示 $S$ 中的顶点。
2. 同理,输出 $T$ 的大小,单独占一行。下一行输出 $|T|$ 个用空格分隔的不同整数,表示 $T$ 中的顶点。
3. 最后一行输出你选择的顶点 $v$。
4. 然后从输入中读取 Mikaela 的回答。
请注意,$S$ 和 $T$ 必须是不相交且非空的集合。
每次输出询问后不要忘记输出换行并刷新输出缓冲区,否则会收到 Idleness limit exceeded 的判罚。具体做法如下:
- C++ 使用 fflush(stdout) 或 cout.flush();
- Java 使用 System.out.flush();
- Pascal 使用 flush(output);
- Python 使用 stdout.flush();
- 其它语言请查阅相关文档。
如果你的程序询问次数过多、询问不合法,或未正确遵循交互规范,可能会收到任意判罚。否则,如果你报告的树不正确,将收到 Wrong Answer 判罚。
请注意,树的结构在交互开始前就已确定,不会因你的询问而改变。
## Hack 格式
Hack 数据格式如下:
第一行包含一个整数 $n$($2 \leq n \leq 500$),表示树的顶点数。
接下来的 $n-1$ 行,每行包含两个用空格分隔的整数 $u$ 和 $v$,表示存在一条无向边 $(u, v)$($1 \leq u, v \leq n$)。
说明/提示
在样例中,树的结构如下:

程序获得 $n = 5$。然后程序向 Mikaela 询问 $S = \{1, 2, 3\}$,$T = \{4, 5\}$,$v = 2$,Mikaela 回答 $5$(满足条件的 $(s, t)$ 对有 $(1, 4)$、$(1, 5)$、$(2, 4)$、$(2, 5)$、$(3, 5)$)。
由 ChatGPT 4.1 翻译