CF1583D.Omkar and the Meaning of Life
普及+/提高
通过率:0%
时间限制:2.00s
内存限制:256MB
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
It turns out that the meaning of life is a permutation p1,p2,…,pn of the integers 1,2,…,n (2≤n≤100). Omkar, having created all life, knows this permutation, and will allow you to figure it out using some queries.
A query consists of an array a1,a2,…,an of integers between 1 and n. a is not required to be a permutation. Omkar will first compute the pairwise sum of a and p, meaning that he will compute an array s where sj=pj+aj for all j=1,2,…,n. Then, he will find the smallest index k such that sk occurs more than once in s, and answer with k. If there is no such index k, then he will answer with 0.
You can perform at most 2n queries. Figure out the meaning of life p.
Interaction
Start the interaction by reading single integer n (2≤n≤100) — the length of the permutation p.
You can then make queries. A query consists of a single line "?a1a2…an" (1≤aj≤n).
The answer to each query will be a single integer k as described above (0≤k≤n).
After making a query do not forget to output end of line and flush the output. Otherwise, you will get Idleness limit exceeded. To do this, use:
- fflush(stdout) or cout.flush() in C++;
- System.out.flush() in Java;
- flush(output) in Pascal;
- stdout.flush() in Python;
- see documentation for other languages.
To output your answer, print a single line "!p1p2…pn" then terminate.
You can make at most 2n queries. Outputting the answer does not count as a query.
Hack Format
To hack, first output a line containing n (2≤n≤100), then output another line containing the hidden permutation p1,p2,…,pn of numbers from 1 to n.
事实证明,生命的意义是一个 1,2,…,n 的排列 p1,p2,…,pn(其中 2≤n≤100)。奥姆卡尔(Omkar)创造了全部生命,因此他知道这个排列,并允许你通过若干次查询来推断出它。
一次查询由一个长度为 n 的数组 a1,a2,…,an 构成,其中每个 aj 是介于 1 和 n 之间的整数(a 不必是排列)。奥姆卡尔首先计算 a 与 p 的逐项和,即构造一个数组 s,使得对所有 j=1,2,…,n,均有 sj=pj+aj。然后,他找出最小的下标 k,使得 sk 在数组 s 中出现次数超过一次,并将该 k 作为回答返回;若不存在这样的 k,则回答为 0。
你最多可进行 2n 次查询。请推断出生命的意义——即排列 p。
交互流程
首先读入一个整数 n(2≤n≤100),表示排列 p 的长度。
随后你可以发起查询。每次查询格式为一行:? a_1 a_2 … a_n(其中 1≤aj≤n)。
每次查询的响应为一个整数 k(0≤k≤n),其含义如上所述。
每次查询后,请务必输出换行符并刷新输出缓冲区,否则将收到 “Idleness limit exceeded” 错误。为此,请使用以下方式:
- C++ 中使用
fflush(stdout)或cout.flush(); - Java 中使用
System.out.flush(); - Pascal 中使用
flush(output); - Python 中使用
stdout.flush(); - 其他语言请查阅相应文档。
当你得出答案后,请输出一行:! p_1 p_2 … p_n,然后终止程序。
你最多可进行 2n 次查询。输出最终答案不计入查询次数。
Hack 格式
用于 Hack 时,首先输出一行包含整数 n(2≤n≤100),然后输出另一行,包含隐藏的排列 p1,p2,…,pn(由 1 到 n 的整数组成)。
输入输出样例
输入#1
5 2 0 1
输出#1
? 4 4 2 3 2 ? 3 5 1 5 5 ? 5 2 4 3 1 ! 3 2 1 5 4
说明/提示
In the sample, the hidden permutation p is [3,2,1,5,4]. Three queries were made.
The first query is a=[4,4,2,3,2]. This yields s=[3+4,2+4,1+2,5+3,4+2]=[7,6,3,8,6]. 6 is the only number that appears more than once, and it appears first at index 2, making the answer to the query 2.
The second query is a=[3,5,1,5,5]. This yields s=[3+3,2+5,1+1,5+5,4+5]=[6,7,2,10,9]. There are no numbers that appear more than once here, so the answer to the query is 0.
The third query is a=[5,2,4,3,1]. This yields s=[3+5,2+2,1+4,5+3,4+1]=[8,4,5,8,5]. 5 and 8 both occur more than once here. 5 first appears at index 3, while 8 first appears at index 1, and 1<3, making the answer to the query 1.
Note that the sample is only meant to provide an example of how the interaction works; it is not guaranteed that the above queries represent a correct strategy with which to determine the answer.
在样例中,隐藏的排列 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。
注意:该样例仅用于说明交互方式;不能保证上述查询构成一种能正确确定答案的有效策略。
输入解题思路,AI测评打分。不知道怎么写?