CF1114E Arithmetic Progression
题目描述
这是一个交互题!
等差数列是指这样一个整数序列:每个元素与其前一个元素的差($x_i - x_{i-1}$,其中 $i \ge 2$)是一个常数,这个常数称为该序列的公差。
也就是说,等差数列的形式为 $x_i = x_1 + (i - 1)d$,其中 $d$ 是该序列的公差。
现在有一个长度为 $n$ 的秘密整数列表 $a_1, a_2, \ldots, a_n$。
保证所有元素 $a_1, a_2, \ldots, a_n$ 都在 $0$ 到 $10^9$ 之间(包含端点)。
这个列表有一个特殊性质:将其升序排列后,会形成一个公差为正数($d > 0$)的等差数列。例如,列表 $[14, 24, 9, 19]$ 满足这一要求,排序后为 $[9, 14, 19, 24]$,可以表示为 $x_n = 9 + 5 \cdot (n - 1)$。
你还拥有一个设备,但电量不足,因此你最多只能进行 $60$ 次如下两种类型的查询:
- 给定一个值 $i$($1 \le i \le n$),设备会显示 $a_i$ 的值。
- 给定一个值 $x$($0 \le x \le 10^9$),设备会返回 $1$,如果存在严格大于 $x$ 的元素,否则返回 $0$。
你最多只能使用这台特殊设备进行 $60$ 次查询。你能否找出该等差数列的最小元素和公差?即,找出等差数列定义中的 $x_1$ 和 $d$。注意,数组 $a$ 并不是有序的。
输入格式
交互开始时,首先输入一个整数 $n$($2 \le n \le 10^6$),表示整数列表的长度。
接下来你可以进行以下两种类型的查询:
- "? i"($1 \le i \le n$)—— 获取 $a_i$ 的值。
- "> x"($0 \le x \le 10^9$)—— 检查是否存在大于 $x$ 的元素。
每次查询后,读取其结果 $r$,为一个整数。
- 对于第一种查询,$r$ 满足 $0 \le r \le 10^9$。
- 对于第二种查询,$r$ 为 $0$ 或 $1$。
- 如果你进行了超过 $60$ 次查询,或查询的数值超出了范围,将会得到 $r = -1$。
- 如果你在收到 $-1$ 后终止,将会得到“Wrong answer”判定。否则你的程序会继续从已关闭的流中读取,可能得到任意判定。
当你确定了最小元素 $x_1$ 和公差 $d$ 后,输出
- "! $x_1$ $d$"
然后退出。该输出不计入 $60$ 次查询限制。
每次输出查询后,别忘了输出换行符并刷新输出缓冲区,否则会因“Idleness limit exceeded”而判错。具体做法如下:
- C++:fflush(stdout) 或 cout.flush()
- Java:System.out.flush()
- Pascal:flush(output)
- Python:stdout.flush()
- 其它语言请参考相关文档。
Hack 数据格式
Hack 时,使用如下格式:
第一行包含一个整数 $n$($2 \le n \le 10^6$),表示列表长度。
第二行包含 $n$ 个整数 $a_1, a_2, \ldots, a_n$($0 \le a_i \le 10^9$),表示列表中的元素。
同时,排序后的列表必须构成一个公差为正数的等差数列。
输出格式
见上文输入格式说明。
说明/提示
请注意,示例交互中包含了额外的空行以便于阅读。实际交互中不会有任何空行,你也不应输出任何额外的空行。
示例测试中的列表为 $[14, 24, 9, 19]$。
由 ChatGPT 4.1 翻译