P15143 [SWERC 2025] Isaac's Queries

题目描述

你已到达热门 roguelike 游戏 Isaac’s Keybindings 的最后一关。你遇到的不是 Boss,而是一位商店老板,他持有一个隐藏的整数数组 $a_1, a_2, \ldots, a_n$,其中对每个 $i \in [1, n]$ 有 $0 \le a_i < 2^{30}$。 保证**该数组是随机生成的**,即除样例外,在所有测试中每个 $i \in [1, n]$ 的 $a_i$ 是 $[0, 2^{30})$ 上的均匀随机整数。 定义 $f(u, v) = a_u \oplus a_{u+1} \oplus \ldots \oplus a_v$,其中 $\oplus$ 表示按位异或。 你可以提出以下格式的询问:`? u v`,其中 $1 \le u \le v \le n$。 询问的答案是: - 若 $f(u, v) = 0$,则为 $-1$; - 否则为 $\lfloor \log_2(f(u, v)) \rfloor$。 每次询问的成本为 $\frac{1}{v - u + 1}$ 机器人币。你初始拥有 $35$ 机器人币,如果余额变为负数则失败。注意,你的机器人币余额在任何时刻都不必是整数。 在不失败的前提下,找出所有可能的 $\frac{n(n+1)}{2}$ 次询问的答案。

输入格式

每个测试包含多个测试用例。第一行包含测试用例的数量 $t$($1 \le t \le 30$)。接下来是测试用例的描述。 每个测试用例的第一行包含一个整数 $n$($1 \le n \le 100$)—— 数组 $a_1, a_2, \ldots, a_n$ 的长度。保证除样例外,在所有测试中该数组是随机生成的。 本题共有恰好 $50$ 个测试(包括样例)。样例的 $t = 1$ 且 $n = 3$,所有其他测试的 $t = 30$ 且 $n = 100$。 ### 交互说明 对于每个测试用例,首先读取一个整数 $n$。如果你读取到的整数是 $-2$,表示前一个测试用例的答案错误,你应当立即退出。 要提出一个询问,请打印一行格式为 `? u v`,其中 $1 \le u \le v \le n$。 作为询问的响应,如果你提出了无效的询问(即格式无效,或者会导致机器人币余额为负),你将收到 $-2$。此时你应当立即退出。否则,你将收到该询问的答案。 当你确定了所有 $\frac{n(n+1)}{2}$ 次询问的答案后,按以下格式输出。 打印 $n + 1$ 行。第一行必须包含单个字符 `!`。接下来的 $n$ 行中,第 $i$ 行必须包含 $n - i + 1$ 个整数:分别对应询问 `? i i`、`? i i+1`、……、`? i n` 的答案。 打印询问后,请不要忘记输出换行并刷新输出缓冲区。为此,请使用: - C++ 中的 `fflush(stdout)` 或 `cout.flush()`; - Java 中的 `System.out.flush()`; - Python 中的 `stdout.flush()`; - 其他语言请参阅相关文档。

输出格式

See Interaction

说明/提示

#### 样例解释 在样例中,隐藏数组为 $[a_1, a_2, a_3] = [2, 4, 6]$。 - 首先,你询问 `? 1 2`。由于 $f(1,2) = a_1 \oplus a_2 = 6$,答案为 $\lfloor \log_2(6) \rfloor = 2$。 - 然后,你询问 `? 1 3`。由于 $f(1,3) = a_1 \oplus a_2 \oplus a_3 = 0$,答案为 $-1$。 - 最后,你询问 `? 2 3`。由于 $f(2,3) = a_2 \oplus a_3 = 2$,答案为 $\lfloor \log_2(2) \rfloor = 1$。 现在,即使不知道隐藏数组,你也可以声明所有可能的 $6$ 次询问的答案。例如,你声明 `? 1 1` 的答案为 $1$。 你花费了 $\frac{1}{2} + \frac{1}{3} + \frac{1}{2} = \frac{4}{3}$ 机器人币,这小于允许的 $35$ 机器人币。 翻译由 DeepSeek 完成