CF1305D Kuroni and the Celebration

题目描述

这是一个交互题。 在经历了 13 次超时后终于通过了一道几何题,Kuroni 决定去一家意大利餐厅庆祝这一神圣的成就。不幸的是,过多的酱汁让他晕头转向,现在他迷路了! 美国可以被建模为一棵有 $n$ 个结点的树(为什么呢),树的根结点为 $r$,Kuroni 的酒店就在这里。 Kuroni 有一个手机应用,专为这种紧急情况设计。使用该应用时,他需要输入两个结点 $u$ 和 $v$,应用会返回一个结点 $w$,即这两个结点的最近公共祖先(LCA)。 然而,由于手机电量几乎耗尽(因为直播了 Kuroni 的庆祝派对),他最多只能使用该应用 $ \lfloor \frac{n}{2} \rfloor $ 次。超过这个次数,手机就会关机,再也无法帮助我们的朋友了。 夜晚又冷又黑,Kuroni 需要尽快回到酒店,才能和他舒适的床和枕头团聚。你能帮他找出酒店的位置吗?

输入格式

首先输入一个整数 $n$($2 \le n \le 1000$),表示树的结点数。 接下来输入 $n-1$ 行,每行两个整数 $x_i$ 和 $y_i$($1 \le x_i, y_i \le n$,$x_i \ne y_i$),表示存在一条连接结点 $x_i$ 和 $y_i$ 的边。保证这些边构成一棵树。 然后你可以进行如下格式的查询: `? u v`($1 \le u, v \le n$),用于查询结点 $u$ 和 $v$ 的最近公共祖先。 每次查询后,读入一个整数 $w$,表示查询结果。 如果你的查询无效,或者查询次数超过 $ \lfloor \frac{n}{2} \rfloor $,程序会输出 $-1$ 并终止交互。你将收到 Wrong answer 判定。此时请立即退出,避免收到其他判定。 当你确定酒店所在结点 $r$ 后,输出 `! r` 并退出。该操作不计入 $ \lfloor \frac{n}{2} \rfloor $ 次查询限制。 注意,树的结构在查询过程中不会改变,即交互器是非自适应的。 每次输出查询后不要忘记输出换行并刷新输出缓冲区,否则可能会收到 Idleness limit exceeded 判定。具体操作如下: - C++:fflush(stdout) 或 cout.flush() - Java:System.out.flush() - Pascal:flush(output) - Python:stdout.flush() - 其它语言请参考相关文档。 Hack 格式: 第一行输入两个整数 $n$ 和 $r$($2 \le n \le 1000$,$1 \le r \le n$),表示结点数和酒店所在的结点编号。 接下来 $n-1$ 行,每行两个整数 $x_i$ 和 $y_i$($1 \le x_i, y_i \le n$),表示一条树边。 输入的边应保证构成一棵树。

输出格式

见输入格式说明。

说明/提示

请注意,示例交互中包含了额外的空行以便阅读。实际交互中不会有任何空行,你也不应输出任何额外的空行。 下图展示了样例测试中的树结构: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF1305D/3f777a34971aedf6bf2be87025826d252775cf29.png) 由 ChatGPT 4.1 翻译