#G0151. MAD序列【2026暑假集训T1】
MAD序列【2026暑假集训T1】
题目描述
本题为交互题。
有一个秘密序列 ,其中包含从 到 的每个整数 ,且每个数字出现恰好两次。
你的任务是通过以下类型的查询猜出这个序列:
- ,选择整数 ( ) 和 个两两不同的位置 ( )。交互器将返回 。
我们将整数序列的 (Maximum Appearing Duplicate)定义为至少出现两次的最大整数。具体来说,如果没有至少出现两次的数字, 值就是 。下面是一些例子:
- ;
- ;
- .
请最多使用 次查询找出秘密序列。
输入格式
输入的第一行包含一个正整数 ,表示测试数据组数。对于每组测试数据:
输入的第一行包含一个正整数 ,含义如上所述。
输出格式
对于每组测试数据,输出 个正整数表示 的值。
注意,这题是交互式的。换句话说,交互器会在你输出一行后,才给你下一条信息。
每输出一行,务必换行并刷新缓冲区,否则会得到 Wrong answer(答案错误)、Runtime error(运行错误)、Idleness limit exceeded(超时)等判定。
刷新缓冲区的方法:
- C++ 用 fflush(stdout) 或 cout.flush();
交互式
要进行查询,请按以下格式输出一行:
- ( )
这里,您选择的索引 必须是 两两不同的。
然后,在每次查询后,读取一个整数,即查询的答案。
您最多可以进行 次此类查询,对于不同的子任务, 的要求不同。
如果您的程序找到了序列 ,请按以下格式打印该行(不带引号):
- $a_1 \space a_2 \space … \space a_{2n−1} \space a_{2n}$ ()
请注意,这不计入查询限制。
之后,进入下一个测试用例,如果这是最后一个测试用例,则退出。
此任务中的交互器是非自适应。换句话说,在交互过程中,序列 不会发生变化。
如果在交互过程中进行的查询次数超过 ,程序必须立即终止,并将收到错误答案判决。否则,您可能会收到任意非正确的判决,因为您的解决方案将继续从封闭流中读取数据。
打印完每一行后,不要忘记输出行尾并刷新输出缓冲区。否则,您将收到 "超过闲置限制 "的判决。要刷新缓冲区:
- C++ 用 fflush(stdout) 或 cout.flush();
2
2
2
0
1
2
0
1
1
? 2 2 1
? 2 1 3
? 3 1 3 4
! 2 2 1 1
? 2 1 2
? 2 1 3
? 3 1 3 4
! 1 2 1 2
样例解释
在第一个测试数据中,隐藏序列为 。
对于查询 ,交互器返回 ,因为 $\operatorname{MAD}([a_2, a_1]) = \operatorname{MAD}([2, 2]) = 2$ 。
对于查询 ,交互器会返回 ,因为 $\operatorname{MAD}([a_1, a_3]) = \operatorname{MAD}([2, 1]) = 0$ 。
对于查询 ,交互器返回 ,因为 $\operatorname{MAD}([a_1, a_3, a_4]) = \operatorname{MAD}([2 ,1, 1]) = 1$ 。
请注意,示例交互仅用于理解语句,并不能保证找到唯一序列 。
数据规模与约定
有合理的子任务依赖。
| 子任务编号 | 分值 | ||
|---|---|---|---|
对于 的数据:保证 。