#P12421. 【MX-X12-T4】「ALFR Round 5」游戏
【MX-X12-T4】「ALFR Round 5」游戏
题目背景
原题链接:https://oier.team/problems/X12D。
题目描述
这是一道交互题。
有一棵 个点的树,树的形态给定,树上有一个隐藏点 ,你每次可以给出一个点 ,交互库选择将 向 移动一步(若 则无事发生),或者返回目前 到 的距离。交互库会告诉你他选择的操作,如果选择的是操作 会告诉你距离。你需要在 次询问内求出目前 的位置。
每个测试点中有 组测试数据。
交互库不自适应,这意味着询问开始前 的位置确定,与你的询问无关。
【交互方式】
首先输入一个正整数 表示测试数据组数。
接下来 组数据,每组数据的第一行输入两个正整数 分别表示树的点数和询问次数限制,接下来 行每行两个数 表示树上存在一条连接 的边。
接着你需要进行交互,询问格式为 ? u
,其中需要满足 ,如果你本组数据的询问次数超过 ,交互库输出 -1
,此时你需要立即结束程序否则之后交互库行为未定义。若询问次数未超过限制,交互库输出 1
或者 2 d
,分别表示交互库选择将 向 移动一步或者告诉你 到 目前的距离为 。当你确定 目前的位置后,输出 ! u
表示 目前在编号为 的节点上。如果你的回答是正确的,交互库输出 1
并进入下一组测试数据,否则交互库输出 0
,你需要立即结束程序否则之后交互库行为未定义。
你需要在你的每次输出后刷新缓冲区。
你可以使用如下语句来清空缓冲区:
- 对于 C/C++:
fflush(stdout)
; - 对于 C++:
std::cout << std::flush
; - 对于 Java:
System.out.flush()
; - 对于 Python:
stdout.flush()
; - 对于 Pascal:
flush(output)
; - 对于其他语言,请自行查阅对应语言的帮助文档。
当你在单个测试点内总询问次数不超过 次时,保证交互库占用时间不超过 s,占用空间不超过 MiB,也就是说你的程序至少可以使用 s 的时间和 MiB 的空间。
输入格式
见【交互方式】。
输出格式
见【交互方式】。
1
4 200
1 2
2 4
2 3
1
1
1
? 2
? 2
! 2
2
5 200
5 1
4 2
2 3
2 1
1
2 1
2 0
1
6 200
6 1
2 1
4 2
4 5
3 2
2 3
2 1
1
1
1
? 2
? 2
? 1
! 1
? 6
? 2
? 4
? 4
! 4
提示
【样例解释 #1】
对于样例 ,初始有 ,询问两次点 ,第一次交互库返回 ,并将 向点 移动一步,,第二次询问交互库返回 ,,所以 不发生变化。此时可以确定 ,回答 后,交互库返回 表示答案正确。
【数据范围】
本题使用捆绑测试。
子任务编号 | 特殊性质 | 分值 | 子任务依赖 | |||
---|---|---|---|---|---|---|
无 | 无 | |||||
A | 无 | |||||
B | ||||||
C | ||||||
无 | ||||||
特殊性质 A:树上每个点度数不大于 。
特殊性质 B:树上只有至多一个点度数大于 。
特殊性质 C:树的生成方式为:对于每个 ,等概率随机选取 中的一个整数 ,将 与 连边。
对于所有数据,,,。