CF1270D Strange Device

题目描述

本题为交互题。 我们有一个长度为 $n$ 的数组 $a$,其中所有元素互不相同(即没有两个数相等)。你可以通过你刚在亚马逊上订购的新设备来获取关于该数组的一些信息。 该设备可以回答如下形式的查询:对于你给出的数组中 $k$ 个不同位置,它会返回这 $k$ 个元素中按升序排列后的第 $m$ 小元素的位置和值。 不幸的是,设备的说明书在运输过程中丢失了。不过你还记得 $k$,但不记得 $m$。你的任务是通过与该设备的交互查询,找出 $m$ 的值。 你最多可以进行 $n$ 次查询。 注意,数组 $a$ 和数字 $m$ 在交互开始前就已经固定,并且不会随着你的查询而改变。换句话说,交互器是非自适应的。 你不需要最小化查询次数,也不需要猜出数组 $a$,你只需要猜出 $m$。

输入格式

第一行包含两个整数 $n$ 和 $k$($1 \le k < n \le 500$),分别表示数组的长度和每次查询涉及的元素个数。 保证 $m$ 满足 $1 \le m \le k$,数组 $a_1, a_2, \dots, a_n$ 满足 $0 \le a_i \le 10^9$,且所有元素互不相同。

输出格式

你需要先读入 $n$ 和 $k$。 每次你想要对下标为 $x_1, x_2, \dots, x_k$ 的元素进行查询时,在单独一行输出 $?~x_1~x_2~x_3~...~x_k$ 查询中的数字需满足 $1 \le x_i \le n$,且所有 $x_i$ 互不相同。不要忘记刷新输出,否则会因“Idleness limit exceeded”而判错。 作为回应,你会收到两个整数 $pos$ 和 $a_{pos}$,其中 $pos$ 表示在你查询的 $k$ 个元素中按升序排列后的第 $m$ 小元素在原数组中的位置,$a_{pos}$ 表示该位置上的元素值。 如果你的查询无效或查询次数超过 $n$,程序会输出 $-1$ 并结束交互。此时你会收到 Wrong answer 判定。请立即退出,避免收到其它判定。 当你确定 $m$ 的值后,输出 $!~m$ 每次输出查询后请务必输出换行并刷新输出缓冲区。具体操作如下: - C++:fflush(stdout) 或 cout.flush() - Java:System.out.flush() - Pascal:flush(output) - Python:stdout.flush() - 其它语言请查阅相关文档。 Hack 格式 对于 Hack,输入格式如下: 第一行包含三个整数 $n, k, m$($1 \le m \le k < n \le 500$),分别表示数组长度、每次查询的元素个数,以及设备返回的第几个元素。 第二行包含 $n$ 个整数 $a_1, a_2, \dots, a_n$($0 \le a_i \le 10^9$),表示数组元素,且所有元素互不相同。

说明/提示

例如,$n = 4$,$k = 3$,$m = 3$,$a = [2, 0, 1, 9]$。 由 ChatGPT 4.1 翻译