CF1451E2 Bitwise Queries (Hard Version)
题目描述
本题的简单版和困难版的唯一区别在于查询次数的限制。
这是一个交互题。
Ridbit 有一个长度为 $n$ 的隐藏整数数组 $a$,他希望 Ashish 猜出这个数组。注意,$n$ 是 $2$ 的幂。Ashish 可以进行三种不同类型的查询,形式如下:
- AND $i$ $j$:询问 $a_i$ 和 $a_j$ 的按位与(bitwise AND)结果($1 \leq i, j \leq n$,$i \neq j$)。
- OR $i$ $j$:询问 $a_i$ 和 $a_j$ 的按位或(bitwise OR)结果($1 \leq i, j \leq n$,$i \neq j$)。
- XOR $i$ $j$:询问 $a_i$ 和 $a_j$ 的按位异或(bitwise XOR)结果($1 \leq i, j \leq n$,$i \neq j$)。
你能帮助 Ashish 猜出数组的所有元素吗?
在本题版本中,每个元素的取值范围为 $[0, n-1]$(包含 $0$ 和 $n-1$),且 Ashish 最多只能询问 $n+1$ 次。
输入格式
输入的第一行包含一个整数 $n$($4 \leq n \leq 2^{16}$)——数组的长度。保证 $n$ 是 $2$ 的幂。
输出格式
每次查询时,输出一行,内容为以下三种之一(不含引号):
- "AND i j"
- "OR i j"
- "XOR i j"
其中 $i$ 和 $j$ 满足 $1 \leq i, j \leq n$,且 $i \neq j$,表示要查询的下标。对于每次查询,你将收到一个整数 $x$,其值取决于查询类型。如果查询的下标无效或查询次数超过限制,你将收到 $x = -1$,此时应立即终止程序。
当你猜出整个数组后,输出一行,格式为 "! "(不含引号),后跟 $n$ 个用空格分隔的整数,表示数组 $a$ 的所有元素。
猜测数组的操作不计入查询次数。
交互器不会自适应。数组 $a$ 在查询过程中不会发生变化。
每次输出查询后,不要忘记输出换行并刷新输出缓冲区,否则会因“Idleness limit exceeded”而失败。具体做法如下:
- C++:使用 fflush(stdout) 或 cout.flush()
- Java:使用 System.out.flush()
- Pascal:使用 flush(output)
- Python:使用 stdout.flush()
- 其他语言请参考相关文档。
Hack 格式
要 Hack 其他解法,请使用如下测试格式:
第一行输出一个整数 $n$($4 \leq n \leq 2^{16}$),保证 $n$ 是 $2$ 的幂。第二行输出 $n$ 个用空格分隔的整数,范围为 $[0, n-1]$,表示数组 $a$。
说明/提示
示例中的数组 $a$ 为 $[0, 0, 2, 3]$。
由 ChatGPT 4.1 翻译