海盗公主 Roxette 到达了 Remeian 群岛的一座秘密岛屿。据传,这里埋藏着著名的宝藏——“黄金优美直线”(golden nice lines)。
这座秘密岛屿是一个 $2 \times 10^{12}$ 米乘 $2 \times 10^{12}$ 米的正方形。岛上的任何一点都可以用笛卡尔坐标 $(x, y)$ 描述,其中 $(0, 0)$ 为中心,两条坐标轴分别平行于岛屿的边。
岛上埋藏着 $N$ 条黄金优美直线。第 $i$ 条直线($0 \le i < N$)占据了所有满足线性方程 $y = a_i x + b_i$ 的实数点 $(x, y)$。
Roxette 可以使用一种名为“直线仪”(lineometer)的特殊装置。对于岛上的任意点 $p$,直线仪会计算从点 $p$ 到 $N$ 条黄金优美直线中每一条的距离之和$^1$。
不幸的是,直线仪的使用次数有限。你能帮助 Roxette 用尽可能少的直线仪使用次数找到宝藏吗?
交互
选手必须实现以下函数:
void solve(int subtask_id, int N);
该函数在交互开始时会被调用恰好一次。$N$ 是岛上隐藏的黄金优美直线的数量。
该函数可以调用另一个函数,但调用次数不能超过 $Q_{max}$ 次:
long double query(long double x, long double y);
选手调用此函数时,参数必须满足 $-10^{12} \le x, y \le 10^{12}$。
它返回直线仪应用于坐标为 $(x, y)$ 的点时的结果,即从点 $(x, y)$ 到 $N$ 条黄金优美直线中每一条的距离之和。注意,黄金优美直线本身不会被直接提供,选手的目标是找到它们。
当选手找到这 $N$ 条黄金优美直线后,必须调用以下函数:
void the_lines_are(std::vector<int> a, std::vector<int> b);
其中 $a[i]$ 和 $b[i]$ 必须描述第 $i$ 条黄金优美直线,对于 $0 \le i < N$。选手可以以任意顺序返回这些直线。
数据范围
- $1 \le N \le 100$
- $-10\,000 \le a_i, b_i \le 10\,000$
- 任意两条直线都不平行。
子任务
计算一个测试点的得分方式如下:
- 令 $Q$ 为调用
query函数的次数。 - 如果 $Q > Q_{max}$,或者黄金优美直线未被正确报告,则该测试点的得分为 0。
- 如果 $Q \le Q_{min}$,则该测试点的得分为 1。
- 否则,该测试点的得分为 $1 - 0.7 \cdot \frac{Q - Q_{min}}{Q_{max} - Q_{min}}$。
计算一个子任务的得分时,取该子任务中每个测试点得分的最小值,然后乘以该子任务的总分。
子任务 1(11 分)
- $N = 1$
- $Q_{min} = 10\,000, Q_{max} = 10\,000$
子任务 2(13 分)
- $N = 2$
- $Q_{min} = 10\,000, Q_{max} = 10\,000$
子任务 3(7 分)
- $N = 3$
- $Q_{min} = 10\,000, Q_{max} = 10\,000$
子任务 4(19 分)
- $-500 \le a_i, b_i \le 500$
- $Q_{min} = 402, Q_{max} = 10\,000$
子任务 5(23 分)
- $N \le 30$
- $Q_{min} = 402, Q_{max} = 10\,000$
子任务 6(27 分)
- $Q_{min} = 402, Q_{max} = 10\,000$
样例
输入 1
solve( /* subtask_id = */ 1, /* N = */ 1)
输出 1
query(0, 0) returns 0
query(1, 1) returns 0
the_lines_are(
/* a = */ {1},
/* b = */ {0})$^1$ 点到直线的欧几里得距离是同时接触该直线和该点的最短线段的长度。