#CF2127G2. Inter Active(困难版本)
Inter Active(困难版本)
时间限制: 每个测试 秒
内存限制: 每个测试 MB
这是本题的困难版本。与简单版本的区别在于,本版本中你最多可以进行 次查询。只有解决了所有版本的题目,你才能进行 hack。
阿里非常喜欢巴哈明的礼物(来自问题 E),以至于他非法从加兹温前往利物浦,想让足球运动员在礼物上签名。现在国际刑警正在追捕他,但他们提供了一个交易:解决一个问题,他就可以留在利物浦。但他现在在体育场里,无法解题——所以他请你来帮忙。
这是一道交互题。
有一个隐藏的排列 ,长度为 ,且对于每个 ,满足 。
首先,你需要向评测机输出一个正整数 ,该 在之后的查询中保持不变。然后你需要通过若干次查询找出排列 。
在每次查询中,你会向评测机给出一个排列 。作为回应,你将收到满足以下所有条件的二元组 的数量:
- ;
- ;
- ( 是你一开始提供给评测机的常数)。
给定 ,你需要在最多 次查询内找出排列 。
输入
每个测试包含多个测试用例。第一行包含测试用例数 ()。接下来是每个测试用例的描述。
每个测试用例只有一行,包含一个整数 ()—— 排列 的长度。
保证所有测试用例的 之和不超过 。
交互方式
每个测试用例的交互从读取整数 开始。
然后你需要输出整数 ()。这不是一次查询。
然后你可以进行最多 次查询。
要进行查询,按以下格式输出一行:
? q1 q2 ... qn
评测机将返回该查询的答案。
当你找到排列 时,按以下格式输出一行:
! p1 p2 ... pn
这也不算作一次查询。
之后继续处理下一个测试用例,如果是最后一个测试用例则终止程序。
交互器不是自适应的,这意味着排列在选手输出 之前就已经确定。
如果你的程序进行了超过 次查询,你的程序应立即终止,以获得 Wrong answer 判决。否则你可能得到任意判决,因为你的程序会继续从已关闭的流中读取。
每次输出查询后,不要忘记输出换行符并刷新输出。否则你将收到 Idleness limit exceeded 判决。
如果在任何交互步骤中你读到了 而不是有效数据,你的程序必须立即退出。这意味着由于无效查询或其他错误,你的程序将收到 Wrong answer。不退出可能导致任意判决,因为你的程序会继续从已关闭的流中读取。
Hack 格式
要进行 hack,使用以下格式:
每个测试包含多个测试用例。第一行包含测试用例数 ()。接下来是每个测试用例的描述。
每个测试用例的第一行包含一个整数 ()—— 排列 的长度。
第二行包含 个整数 (,,所有 互不相同)—— 排列 。
保证所有测试用例的 之和不超过 。
刷新输出方式
- C++:
fflush(stdout)或cout.flush(); - Python:
sys.stdout.flush(); - 其他语言请查阅相关文档。
样例输入
2
4
1
5
1
2
样例输出
1
? 1 2 3 4
! 3 1 4 2
3
? 1 2 5 4 3
? 2 1 4 3 5
! 3 1 2 5 4
提示
在第一个测试用例中,。程序选择了 ,然后查询了 。只有二元组 满足条件。
在第二个测试用例中,。程序选择了 。
- 对于排列 ,只有 满足条件。
- 对于排列 , 和 满足条件。