P13989 [PO Final 2023] 锯木 / The Sawmill
题目背景
1G, 1s, sagverket
题目描述
Alma 有很多木板,她想把这些木板锯成若干段。因此,她来到了一家能够自动切割并分类木板的先进锯木厂。每块木板可以表示为一条无限长的 $ x $ 轴,锯木厂会在 $ N+1 $ 个位置 $ x_1, x_2, \dots, x_N, v $ 处切割,其中 $ v $ 是由用户选择的一个数。随后,所有有限长度的木段会被分类并输出。Alma 想知道这些数 $ x_1, x_2, \dots, x_N $,但似乎没有人知道锯木厂内部的结构。于是,她计划通过投入若干选择得当的 $ v $ 来找出这些数。
有 $ N $ 个秘密整数 $ 1 \le x_1 < x_2 < \dots < x_N \le 10^9 $。注意这些数两两不同。你的目标是找出这些数。你可以向锯木厂送入木板。锯木厂以一个整数 $ v $ 作为输入($ 1 \le v \le 10^9 $),并执行如下操作:
1. 创建列表 $ L = [x_1, x_2, \dots, x_N, v] $。
2. 对 $ L $ 排序。
3. 创建列表 $ D $,其中对所有 $ i = 1, 2, \dots, N $,有 $ D_i = L_{i+1} - L_i $。
4. 对 $ D $ 排序,并返回其中的 $ N $ 个整数。
你最多可以送入 $ N $ 块木板,**但在子任务 $ 4 $ 中可以送入 $ \textcolor{red}{N+1} $ 块木板**。
### 实现细节
你的程序应首先读入两个整数 $ N $ 和 $ T $($ 1 \le N \le 1000, 1 \le T \le 5 $)。$ N $ 是需要找出的秘密数字个数,$ T $ 是测试组编号。给出 $ T $ 的原因是为了便于获得部分分。
接着,你可以开始送入木板。打印一行 $\texttt{? }v$ 以向锯木厂送入带有数字 $ v $ 的木板。数 $ v $ 必须满足 $ 1 \le v \le 10^9 $。随后,你的程序应在一行中读入 $ N $ 个整数,即 $ D_1, D_2, \dots, D_N $。注意:如果 $ v $ 恰好等于某个 $ x_i $,则 $ D_1 $ 可能为 $ 0 $。
当你已经找到 $ x_1, x_2, \dots, x_N $ 时,你应打印一行
$\texttt{!}$ $ x_1 $ $ x_2 $ $ x_3 $ $\ldots$ $ x_N $。
然后你的程序应终止,并且不再打印任何内容。
**请在每次询问后都刷新缓冲区**,否则可能会因为超时而被判为超时。在 C++ 中可使用例如 `cout
输入格式
见「实现细节」。
输出格式
见「实现细节」。
说明/提示
### 子任务
**本题采用捆绑测试。**
| 子任务编号 | 分值 | 限制 |
|:-:|:-:|-------------|
| $ 1 $ | $ 15 $ | $ N = 1 $ |
| $ 2 $ | $ 15 $ | $ N = 2 $ |
| $ 3 $ | $ 11 $ | $ x_i \le N + 1 $ |
| $ 4 $ | $ 37 $ | $ N \le 100, x_i \le 10^4 $,可最多发送 $ \textcolor{red}{N+1} $ 块木板。 |
| $ 5 $ | $ 22 $ | 无额外约束。 |