#P17121. [ICPC 2025 Shanghai R] Menji, we miss you!
[ICPC 2025 Shanghai R] Menji, we miss you!
背景
试题来自 清华大学学生算法协会。
题目描述
Menji 走丢了,大家都很想念他。你的任务就是找到他!
有一棵二叉树 ,由 个顶点构成,树 的每条边长度均为 。Menji 藏在顶点 处。你知道树的结构,但不知道 。
为了找到 ,你可以发送信号。你可以选定一个顶点 并选定一个信号强度 ,然后从顶点 发送强度为 的信号。如果 和 之间的距离不超过 ,Menji 就会收到信号并发回一个信号,你也将收到信号。否则,你将收不到任何东西。
发送信号很慢,而你又很着急,所以请用不超过 次信号确定 Menji 的位置。
交互协议
输入包含多组测试用例。第一行包含一个整数 (),表示测试用例的数量。
对于每个测试用例,第一行包含一个整数 (),表示树中的顶点数。
第二行包含 个整数 (),其中 是顶点 在树上的父节点。树以顶点 为根。
保证这棵树是一棵二叉树,即不存在 使得 。
发送信号时,请按以下格式输出一行:
? u k:表示你在顶点 处生成一个强度为 的信号。你需要保证 ,。然后你必须读入一个整数 ()。如果你收到了信号,或者说 ,则 ,否则 。
报告答案时,请按以下格式输出一行:
! u:表示你已经找到 。输出此行后,你需要进入下一个测试用例,如果没有更多测试用例则终止程序。
对于每个测试用例,你最多可以发送 次信号。报告答案不计入信号次数。
如果你发送了超过 次信号,或者发送的信号格式错误,或者报告的答案不正确,交互将会终止,你将得到 Wrong answer 的判定。
注意,交互器是自适应的,这意味着答案可能会根据你的询问而改变,只要它始终与约束条件和先前询问的回答保持一致即可。
保证所有测试用例的 之和不超过 。
在打印每一行后,请不要忘记输出换行符并刷新输出。在 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 完成