CF1583D Omkar and the Meaning of Life
题目描述
事实证明,生命的意义是一个排列 $p_1, p_2, \ldots, p_n$,它是整数 $1, 2, \ldots, n$ 的一个排列($2 \leq n \leq 100$)。Omkar 作为生命的创造者,知道这个排列,并允许你通过若干次询问来找出它。
一次询问由一个数组 $a_1, a_2, \ldots, a_n$ 组成,其中每个 $a_j$ 是 $1$ 到 $n$ 之间的整数。$a$ 不要求是一个排列。Omkar 首先会计算 $a$ 和 $p$ 的按位和,即计算数组 $s$,其中 $s_j = p_j + a_j$,对于所有 $j = 1, 2, \ldots, n$。然后,他会找到最小的下标 $k$,使得 $s_k$ 在 $s$ 中出现超过一次,并以 $k$ 作为回答。如果没有这样的下标 $k$,则回答 $0$。
你最多可以进行 $2n$ 次询问。请你找出生命的意义 $p$。
输入格式
首先读入一个整数 $n$($2 \leq n \leq 100$),表示排列 $p$ 的长度。
接下来你可以进行询问。每次询问为一行,格式为“$? \ a_1 \ a_2 \ \ldots \ a_n$”($1 \leq a_j \leq n$)。
每次询问的回答为一个整数 $k$,如上所述($0 \leq k \leq n$)。
每次询问后不要忘记输出换行并刷新输出缓冲区,否则会导致“Idleness limit exceeded”。具体做法如下:
- C++:fflush(stdout) 或 cout.flush()
- Java:System.out.flush()
- Pascal:flush(output)
- Python:stdout.flush()
- 其它语言请参考相关文档。
当你确定答案后,输出一行“$! \ p_1 \ p_2 \ \ldots \ p_n$”并结束程序。
你最多可以进行 $2n$ 次询问,输出答案不计入询问次数。
Hack 格式
进行 Hack 时,首先输出一行 $n$($2 \leq n \leq 100$),然后输出一行隐藏排列 $p_1, p_2, \ldots, p_n$,它是 $1$ 到 $n$ 的一个排列。
输出格式
首先读入一个整数 $n$($2 \leq n \leq 100$),表示排列 $p$ 的长度。
接下来你可以进行询问。每次询问为一行,格式为“$? \ a_1 \ a_2 \ \ldots \ a_n$”($1 \leq a_j \leq n$)。
每次询问的回答为一个整数 $k$,如上所述($0 \leq k \leq n$)。
当你确定答案后,输出一行“$! \ p_1 \ p_2 \ \ldots \ p_n$”并结束程序。
说明/提示
在样例中,隐藏排列 $p$ 为 $[3, 2, 1, 5, 4]$。共进行了三次询问。
第一次询问 $a = [4, 4, 2, 3, 2]$,得到 $s = [3 + 4, 2 + 4, 1 + 2, 5 + 3, 4 + 2] = [7, 6, 3, 8, 6]$。$6$ 是唯一出现超过一次的数,且第一次出现的位置是 $2$,所以本次询问的答案为 $2$。
第二次询问 $a = [3, 5, 1, 5, 5]$,得到 $s = [3 + 3, 2 + 5, 1 + 1, 5 + 5, 4 + 5] = [6, 7, 2, 10, 9]$。本次没有出现超过一次的数,所以答案为 $0$。
第三次询问 $a = [5, 2, 4, 3, 1]$,得到 $s = [3 + 5, 2 + 2, 1 + 4, 5 + 3, 4 + 1] = [8, 4, 5, 8, 5]$。$5$ 和 $8$ 都出现了多次,$5$ 第一次出现的位置是 $3$,$8$ 第一次出现的位置是 $1$,因为 $1 < 3$,所以答案为 $1$。
注意,样例仅用于说明交互方式,不保证上述询问是确定答案的正确策略。
由 ChatGPT 4.1 翻译