#P15143. [SWERC 2025] Isaac's Queries
[SWERC 2025] Isaac's Queries
说明
你已到达热门 roguelike 游戏 Isaac’s Keybindings 的最后一关。你遇到的不是 Boss,而是一位商店老板,他持有一个隐藏的整数数组 ,其中对每个 有 。
保证该数组是随机生成的,即除样例外,在所有测试中每个 的 是 上的均匀随机整数。
定义 $f(u, v) = a_u \oplus a_{u+1} \oplus \ldots \oplus a_v$,其中 表示按位异或。
你可以提出以下格式的询问:? u v,其中 。
询问的答案是:
- 若 ,则为 ;
- 否则为 。
每次询问的成本为 机器人币。你初始拥有 机器人币,如果余额变为负数则失败。注意,你的机器人币余额在任何时刻都不必是整数。
在不失败的前提下,找出所有可能的 次询问的答案。
输入格式
每个测试包含多个测试用例。第一行包含测试用例的数量 ()。接下来是测试用例的描述。
每个测试用例的第一行包含一个整数 ()—— 数组 的长度。保证除样例外,在所有测试中该数组是随机生成的。
本题共有恰好 个测试(包括样例)。样例的 且 ,所有其他测试的 且 。
交互说明
对于每个测试用例,首先读取一个整数 。如果你读取到的整数是 ,表示前一个测试用例的答案错误,你应当立即退出。
要提出一个询问,请打印一行格式为 ? u v,其中 。
作为询问的响应,如果你提出了无效的询问(即格式无效,或者会导致机器人币余额为负),你将收到 。此时你应当立即退出。否则,你将收到该询问的答案。
当你确定了所有 次询问的答案后,按以下格式输出。
打印 行。第一行必须包含单个字符 !。接下来的 行中,第 行必须包含 个整数:分别对应询问 ? i i、? i i+1、……、? i n 的答案。
打印询问后,请不要忘记输出换行并刷新输出缓冲区。为此,请使用:
- C++ 中的
fflush(stdout)或cout.flush(); - Java 中的
System.out.flush(); - Python 中的
stdout.flush(); - 其他语言请参阅相关文档。
1
3
2 4 6
? 1 2
? 1 3
? 2 3
!
1 2 -1
2 1
2
提示
样例解释
在样例中,隐藏数组为 。
- 首先,你询问
? 1 2。由于 ,答案为 。 - 然后,你询问
? 1 3。由于 ,答案为 。 - 最后,你询问
? 2 3。由于 ,答案为 。
现在,即使不知道隐藏数组,你也可以声明所有可能的 次询问的答案。例如,你声明 ? 1 1 的答案为 。
你花费了 $\frac{1}{2} + \frac{1}{3} + \frac{1}{2} = \frac{4}{3}$ 机器人币,这小于允许的 机器人币。
翻译由 DeepSeek 完成
京公网安备 11011102002149号