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