#P17121. [ICPC 2025 Shanghai R] Menji, we miss you!

    ID: 19458 远端评测题 1000ms 1024MiB 尝试: 0 已通过: 0 显示难度提高 上传者: 标签>倍增二分2025上海交互题Special Judge树的遍历ICPC树的重心

[ICPC 2025 Shanghai R] Menji, we miss you!

背景

试题来自 清华大学学生算法协会

题目描述

Menji 走丢了,大家都很想念他。你的任务就是找到他!

有一棵二叉TT,由 nn 个顶点构成,树 TT 的每条边长度均为 11。Menji 藏在顶点 XX 处。你知道树的结构,但不知道 XX

为了找到 XX,你可以发送信号。你可以选定一个顶点 uu 并选定一个信号强度 kk,然后从顶点 uu 发送强度为 kk 的信号。如果 uuXX 之间的距离不超过 kk,Menji 就会收到信号并发回一个信号,你也将收到信号。否则,你将收不到任何东西。

发送信号很慢,而你又很着急,所以请用不超过 4040 次信号确定 Menji 的位置。

交互协议

输入包含多组测试用例。第一行包含一个整数 TT (1T1001 \le T \le 100),表示测试用例的数量。

对于每个测试用例,第一行包含一个整数 nn (2n3×1042 \le n \le 3 \times 10^4),表示树中的顶点数。

第二行包含 n1n - 1 个整数 fa2,fa3,,fanfa_2, fa_3, \cdots, fa_n (1fai<i1 \le fa_i < i),其中 faifa_i 是顶点 ii 在树上的父节点。树以顶点 11 为根。

保证这棵树是一棵二叉树,即不存在 1<i<j<kn1 < i < j < k \le n 使得 fai=faj=fakfa_i = fa_j = fa_k

发送信号时,请按以下格式输出一行:

  • ? u k:表示你在顶点 uu 处生成一个强度为 kk 的信号。你需要保证 1un1 \le u \le n0kn0 \le k \le n。然后你必须读入一个整数 oo (o{0,1}o \in \{0,1\})。如果你收到了信号,或者说 dis(u,X)kdis(u, X) \le k,则 o=1o = 1,否则 o=0o = 0

报告答案时,请按以下格式输出一行:

  • ! u:表示你已经找到 X=uX = u。输出此行后,你需要进入下一个测试用例,如果没有更多测试用例则终止程序。

对于每个测试用例,你最多可以发送 4040 次信号。报告答案不计入信号次数。

如果你发送了超过 4040 次信号,或者发送的信号格式错误,或者报告的答案不正确,交互将会终止,你将得到 Wrong answer 的判定。

注意,交互器是自适应的,这意味着答案可能会根据你的询问而改变,只要它始终与约束条件和先前询问的回答保持一致即可。

保证所有测试用例的 nn 之和不超过 3×1043 \times 10^4

在打印每一行后,请不要忘记输出换行符并刷新输出。在 C++ 中你可以使用 fflush(stdout)cout.flush() 来刷新流,Java 中使用 System.out.flush(),Python 中使用 stdout.flush()

2
7
1 1 2 2 3 3

1

0

0

7
1 1 2 2 3 3

0

1



? 2 1

? 3 2

? 4 0

! 5


? 2 1

? 3 0

! 3

提示

翻译由 DeepSeek V4 Pro 完成