QOJ.ac

QOJ

Time Limit: 5 s Memory Limit: 64 MB Total points: 100

#9512. 绘图

Statistics

我们将平面上的一系列点称为一个“绘图”(plot)。我们打算将给定的绘图 $(P_{1},\ldots,P_{n})$ 替换为另一个至多包含 $m$ 个点($m \le n$)的绘图,使得它能最好地“近似”原始绘图。

新绘图的创建方式如下:将点序列 $P_{1},\ldots,P_{n}$ 分割为 $s$ ($s \le m$) 个连续的子序列:

$$(P_{k_{0}+1},\ldots,P_{k_{1}}), (P_{k_{1}+1},\ldots,P_{k_{2}}), \ldots, (P_{k_{s-1}+1},\ldots,P_{k_{s}})$$

其中 $0 = k_{0} < k_{1} < k_{2} < \ldots < k_{s} = n$。随后,对于每个 $i=1,\ldots,s$,将子序列 $(P_{k_{i-1}+1},\ldots,P_{k_{i}})$ 替换为一个新点 $Q_{i}$。在这种情况下,我们称点 $P_{k_{i-1}+1},\ldots,P_{k_{i}}$ 被收缩到了点 $Q_{i}$。最终得到由点 $Q_{1},\ldots,Q_{s}$ 组成的新绘图。该绘图与原始绘图的相似度衡量标准是所有点 $P_{1},\ldots,P_{n}$ 到其被收缩到的点之间的最大距离:

$$\max_{i=1,\ldots,s} {\left(\max_{j=k_{i-1}+1,\ldots,k_{i}} {(d(P_{j},Q_{i}))}\right)}$$

其中 $d(P_{j},Q_{i})$ 表示点 $P_{j}$ 和 $Q_{i}$ 之间的距离,由以下公式给出:

$$d((x_{1},y_{1}),(x_{2},y_{2})) = \sqrt{(x_{2}-x_{1})^2+(y_{2}-y_{1})^2}$$

一个示例绘图 $(P_{1},\ldots,P_{7})$ 和新绘图 $(Q_{1},Q_{2})$,其中 $(P_{1},\ldots,P_{4})$ 被收缩到 $Q_{1}$,而 $(P_{5},P_{6},P_{7})$ 被收缩到 $Q_{2}$。

对于给定的包含 $n$ 个点的绘图,你需要找到一个至多包含 $m$ 个点的绘图,使其与原始绘图的相似度最高,其中分割成连续子序列的方式可以任意选择。由于浮点运算的精度限制,如果结果与最优相似度的偏差不超过 $0.000001$,则认为该结果是正确的。

输入格式

标准输入的第一行包含两个整数 $n$ 和 $m$,$1 \le m \le n \le 100\,000$,由一个空格分隔。接下来的 $n$ 行,每行包含两个整数,由一个空格分隔。第 $(i+1)$ 行给出 $x_{i}, y_{i}$,$-1\,000\,000 \le x_{i},y_{i} \le 1\,000\,000$,表示点 $P_{i}$ 的坐标 $(x_{i},y_{i})$。

输出格式

第一行输出一个实数 $d$,表示所求绘图与原始绘图的相似度衡量值。第二行输出一个整数 $s$,$1 \le s \le m$。接下来的 $s$ 行应指定点 $Q_{1},\ldots,Q_{s}$ 的坐标,每行一个点。即第 $(i+2)$ 行应给出两个实数 $u_{i}$ 和 $v_{i}$,由一个空格分隔,表示点 $Q_{i}$ 的坐标 $(u_{i},v_{i})$。所有实数应保留小数点后最多 15 位。

样例

输入 1

7 2
2 0
0 4
4 4
4 2
8 2
11 3
14 2

输出 1

3.00000000
2
2.00000000 1.76393202
11.00000000 1.99998199

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.