QOJ.ac

QOJ

时间限制: 0.2 s 内存限制: 256 MB 总分: 100 交互

#151. 优美的直线

统计

海盗公主 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$ 点到直线的欧几里得距离是同时接触该直线和该点的最短线段的长度。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.