CF1364E X-OR
题目描述
这是一个交互题!
Ehab 有一个长度为 $n$ 的隐藏排列 $p$,其元素为 $0$ 到 $n-1$ 的整数。你出于某种原因想要找出这个排列。为此,你可以向 Ehab 提出 $2$ 个不同的下标 $i$ 和 $j$,他会回复你 $(p_i|p_j)$,其中 $|$ 表示[按位或](https://en.wikipedia.org/wiki/Bitwise_operation#OR)操作。
Ehab 最多会回答你 $4269$ 个问题。虽然他愿意回答这么多问题,但他懒得陪你玩,所以他会提前固定好排列,并不会根据你的询问改变排列。你能猜出这个排列吗?
输入格式
第一行包含一个整数 $n$,表示排列的长度,$3 \le n \le 2048$。
输出格式
每次询问时,输出一行 "? $i$ $j$"(不带引号,$i \neq j$)。然后你需要读取一个答案,即 $(p_i|p_j)$。
如果你收到 $-1$ 作为回复,说明你超出了询问次数限制或询问不合法。
收到 $-1$ 后请立即退出,否则你的程序会因为继续读取已关闭的流而得到错误的判定。
当你猜出排列后,输出一行 "! $p_1$ $p_2$ $\ldots$ $p_n$"(不带引号)。注意,输出答案不计入 $4269$ 次询问次数。
每次输出询问或答案后,请务必输出换行并刷新输出缓冲区。否则会因为超时而被判为“空闲时间超限”。具体做法如下:
- C++:fflush(stdout) 或 cout.flush()
- Java:System.out.flush()
- Pascal:flush(output)
- Python:stdout.flush()
- 其他语言请参考相关文档。
Hack 格式:
第一行包含一个整数 $n$($3 \le n \le 2^{11}$),表示排列 $p$ 的长度。
第二行包含 $n$ 个用空格分隔的整数 $p_1, p_2, \ldots, p_n$($0 \le p_i < n$),表示排列 $p$ 的元素。
说明/提示
在第一个样例中,排列为 $[1,0,2]$。你首先询问 $p_1|p_2$,Ehab 回复 $1$。然后你询问 $p_1|p_3$,Ehab 回复 $3$。最后你询问 $p_2|p_3$,Ehab 回复 $2$。你由此猜出了排列。
由 ChatGPT 4.1 翻译