CF1761G Centroid Guess

题目描述

这是一个交互题。 有一棵未知的树,共有 $n$ 个结点,并且恰好有一个重心。你一开始只知道 $n$,你的任务是找出这棵树的重心。 你最多可以询问 $2\cdot10^5$ 次任意两点之间的距离。 注意,交互器是非自适应的。也就是说,每组测试中的树在测试开始前就已经固定,不会根据你的询问发生变化。 如果删除某个结点后,树被分成的每个连通块的结点数都不超过 $\lfloor\frac{n}{2}\rfloor$,那么这个结点被称为重心。

输入格式

输入的唯一一行包含一个整数 $n$($3\le n\le 7.5\cdot10^4$),表示树的结点数。

输出格式

首先读入 $n$ 开始交互。 每次你想询问结点 $u$ 和结点 $v$($1 \le u, v \le n$)之间的距离时,输出 "? u v"。 当你确定树的重心为 $x$ 时,输出 "! x" 进行报告。 每次输出后不要忘记换行并刷新输出缓冲区,否则会导致“Idleness limit exceeded”错误。具体操作如下: - C++:fflush(stdout) 或 cout.flush() - Java:System.out.flush() - Pascal:flush(output) - Python:stdout.flush() - 其它语言请查阅相关文档。 本题不支持 Hack。 保证本题最多有 $500$ 组测试数据。

说明/提示

下图是样例中树的结构示意图。 ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF1761G/98bb859f14104a55707d7de6fc6821a6b281529d.png) 由 ChatGPT 4.1 翻译