CF1438F Olha and Igor
题目描述
这是一个交互题。
Igor 想要找到通往 Olha 心灵的钥匙。问题在于,这把钥匙藏在一棵二叉树的根节点上。
有一棵高度为 $h$ 的完美二叉树,共有 $n = 2^{h} - 1$ 个节点。每个节点都被分配了 $1$ 到 $n$ 的不同标签。然而,Igor 只知道 $h$,并不知道每个标签对应哪个节点。
为了找到通往 Olha 心灵的钥匙,他需要在最多 $n+420$ 次的查询中,找出根节点的标签。每次查询可以进行如下操作:
- 选择三个不同的标签 $u$、$v$ 和 $w$($1 \leq u,v,w \leq n$)。
- 作为回应,Olha(评测器)会告诉他:如果以标签为 $w$ 的节点作为根节点,那么标签为 $u$ 和 $v$ 的节点的最近公共祖先的标签。
请你帮助 Igor 找到根节点的标签!
注意:评测器是非自适应的,所有标签在所有查询前就已经固定。
输入格式
第一行包含一个整数 $h$($3 \le h \le 18$),表示二叉树的高度。
输出格式
你需要首先读取 $h$。
每次查询标签 $u, v, w$ 时,在单独一行输出 "? u v w"。
查询中的数字需满足 $1 \le u, v, w \le n$,且 $u \ne v$,$u \ne w$,$v \ne w$。
作为回应,你会收到 $1 \le x \le n$,表示如果以 $w$ 为根节点,$u$ 和 $v$ 的最近公共祖先的标签。
如果你的查询无效,或者查询次数超过 $n+420$,程序会输出 $-1$ 并终止交互。你会收到 Wrong answer 判定。请立即退出以避免其他判定。
当你确定根节点的标签后,输出 "! r",其中 $r$ 是根节点的标签。
每次输出查询后不要忘记换行并刷新输出缓冲区,否则会收到 Idleness limit exceeded 判定。具体做法如下:
- C++:fflush(stdout) 或 cout.flush()
- Java:System.out.flush()
- Pascal:flush(output)
- Python:stdout.flush()
- 其它语言请参考相关文档。
Hack 格式
Hack 时请使用以下格式:
第一行输入一个整数 $h$(二叉树高度)。
第二行输出一个长度为 $n = 2^h - 1$ 的排列 $p$。这表示一棵二叉树,根节点标签为 $p_1$,对于 $1 < i \le n$,$p_i$ 的父节点为 $p_{ \lfloor{\frac{i}{2}}\rfloor }$。
说明/提示
示例中的标签排列为 $[4, 7, 2, 6, 1, 5, 3]$,即根节点标签为 $4$,对于 $1 < i \le n$,$p_i$ 的父节点为 $p_{ \lfloor{\frac{i}{2}}\rfloor }$。
由 ChatGPT 4.1 翻译