CF1354G Find a Gift

题目描述

这是一个交互式问题。请不要忘记在每次输出查询后刷新输出缓冲区,例如在 C++ 中使用 `cout.flush()` 或 `fflush(stdout)`,其他编程语言请使用类似函数。 有 $n$ 个礼品盒排成一排,从左到右编号为 $1$ 到 $n$。已知其中恰好有 $k$ 个盒子里装有贵重礼物,其余盒子里只装有幸运石。所有盒子的外观完全相同,仅在重量上有所不同。所有装有幸运石的盒子重量相同,并且严格重于装有贵重礼物的盒子。但贵重礼物可能不同,因此装有贵重礼物的盒子的重量可能各不相同。 你最多可以进行 $50$ 次查询(输出答案不计入查询次数)。每次查询,你可以比较两个不相交的盒子子集 $a_1, a_2, \dots, a_{k_a}$ 和 $b_1, b_2, \dots, b_{k_b}$ 的总重量。你将收到以下四种结果之一: - FIRST:如果子集 $a_1, a_2, \dots, a_{k_a}$ 的总重量严格更重; - SECOND:如果子集 $b_1, b_2, \dots, b_{k_b}$ 的总重量严格更重; - EQUAL:如果两个子集的总重量相等; - WASTED:如果查询不合法或查询次数超限。 通过这些查询(或者凭直觉),请找出编号最小的装有贵重礼物的盒子。

输入格式

输入包含多组测试数据。首先输入整数 $T$($1 \le T \le 500$),表示测试用例的数量。 每组测试数据开始时输入两个整数 $n$ 和 $k$($2 \le n \le 1000$,$1 \le k \le \frac{n}{2}$),分别表示盒子的数量和装有贵重礼物的盒子数量。 保证每组测试数据的盒子顺序在测试前已固定,且所有测试数据中 $n$ 的总和不超过 $1000$。

输出格式

对于每组测试数据,输出所有装有贵重礼物的盒子中编号最小的盒子的编号,格式为:“! $x$”,其中 $x$($1 \le x \le n$)为该盒子的编号。 # 交互说明 每次查询请输出三行。第一行输出子集大小,格式为:“? $k_a$ $k_b$”,其中 $k_a$ 和 $k_b$($1 \le k_a, k_b \le n$,$k_a + k_b \le n$)为两个子集的大小。 第二行输出 $k_a$ 个整数 $a_1, a_2, \dots, a_{k_a}$($1 \le a_i \le n$,$a_i$ 互不相同),表示第一个子集的盒子编号。 第三行输出 $k_b$ 个整数 $b_1, b_2, \dots, b_{k_b}$($1 \le b_i \le n$,$b_i$ 互不相同),表示第二个子集的盒子编号。 两个子集不能有交集,即对于所有 $i, j$,有 $a_i \neq b_j$。 你将收到上述四种结果之一。如果收到 WASTED,请立即停止程序,以避免获得随机判题结果而不是 Wrong Answer。

说明/提示

样例中的额外分隔符“–”仅用于增加可读性。提交代码时请勿输出任何不必要的符号或换行。 本题禁止 Hack。 由 ChatGPT 4.1 翻译