#P12567. [UOI 2023] An Array of Coins and Weighing Requests

    ID: 12419 远端评测题 1000ms 256MiB 尝试: 0 已通过: 0 难度: (无) 上传者: 标签>2023交互题Special JudgeUOI(乌克兰)

[UOI 2023] An Array of Coins and Weighing Requests

Description

这是一道交互题。

nn 枚硬币排成一行,从左到右编号为 11nn

其中恰好有 kk 枚(k<nk<n)是假币,其余 (nk)(n-k) 枚是真币。假币比真币轻,且所有真币重量相同,而假币的重量可能不同。已知假币是连续的,即它们的编号为 p,p+1,,(p+k1)p, p+1, \dots, (p+k-1)

你需要找出最左侧假币的编号。可以通过称重操作来获取信息:选择两个不相交的硬币集合,比较它们的重量,判断哪个集合更重或两者重量相同。

交互协议

第一行包含三个整数 nnkkgg1k<n1041 \le k < n \le 10^40g60 \le g \le 6)——分别表示硬币总数、假币数量和测试块编号。

要执行称重请求,输出 "?\texttt{?} s1s_1 s2s_2 a1a_1 a2a_2 \dots as1a_{s_1} b1b_1 b2b_2 \dots bs2b_{s_2}",其中 s1s_1s2s_2 表示待称重集合的大小,数组 aabb 分别表示属于第一个和第二个集合的硬币编号。

作为响应,评测程序会输出一个整数 xxx{0,1,2}x \in \{0,1,2\})。如果 x=1x = 1,表示第一个集合比第二个重;如果 x=2x = 2,表示第二个集合比第一个重;如果 x=0x = 0,表示两者重量相同。

如果请求无效(例如超过最大请求次数或参数非法),评测程序会输出 -1\texttt{-1} 并终止程序。此时,你的程序应终止运行,否则会收到 Wrong Answer\texttt{Wrong Answer} 的判定。

每次输出后务必调用 flush\texttt{flush} 方法。可以使用以下方式:

  • C++:fflush(stdout)\texttt{fflush(stdout)}cout << endl\texttt{cout << endl}cout.flush()\texttt{cout.flush()}
  • Java:System.out.flush()\texttt{System.out.flush()}
  • Pascal:flush(output)\texttt{flush(output)}
  • Python:sys.stdout.flush()\texttt{sys.stdout.flush()}
  • 其他编程语言请查阅相关文档。

提交答案时,输出一行 "!\texttt{!} pp",其中 pp1pn1 \leq p \leq n)是最左侧假币的编号。

Input Format

见交互协议。

Output Format

见交互协议。

4 1 0

0

0

2

? 1 1 1 2

? 1 1 2 4

? 1 1 3 4

! 3

Hint

定义 qq 为某个测试块中允许的最大称重查询次数。

  • 55 分):n16n \le 16q=16q=16
  • 99 分):k=1k=1q=16q=16
  • 77 分):k=1k=1q=11q=11
  • 1616 分):k16k \le 16q=11q=11
  • 99 分):所有假币重量相同,q=11q=11
  • (最多 5454 分):q=300q=300。设实际使用的称重次数为 cc,若 c9c \le 9,得 5454 分;否则得 $\lfloor 54 \cdot \max(-0.0004 \cdot c + 0.3134, 0.018 + \frac{9.0773}{c}) \rfloor$ 分。

以下是计算最后一个测试块得分的 C++ 代码(基于称重次数 cc):

((c <= 9) ? 54 : int(54 * (max((-0.0004 * c + 0.3134), (0.018 + 9.0773 / c)))))

评分表

$$\begin{array}{|c|c|c|c|c|c|} \hline c \leq 17 & \text{得分} & 18 \leq c \leq 27 & \text{得分} & 28 \leq c \leq 300 & \text{得分} \\ \hline \leq 9 & 54 & 18 & 28 & 28 & 18 \\ 10 & 49 & 19 & 26 & 29-30 & 17 \\ 11 & 45 & 20 & 25 & 31-42 & 16 \\ 12 & 41 & 21 & 24 & 43-89 & 15 \\ 13 & 38 & 22 & 23 & 90-135 & 14 \\ 14 & 35 & 23 & 22 & 136-181 & 13 \\ 15 & 33 & 24 & 21 & 182-227 & 12 \\ 16 & 31 & 25 & 20 & 228-274 & 11 \\ 17 & 29 & 26-27 & 19 & 275-300 & 10 \\ \hline \end{array}$$