QOJ.ac

QOJ

Limite de temps : 1.0 s Limite de mémoire : 2048 MB Points totaux : 100

#15930. 折线简化

Statistiques

地图应用通常将国家、城市等的边界表示为折线,即相连的线段序列。由于在用户放大地图时需要显示精细的细节,这些折线通常包含非常多的线段。然而,当用户缩小地图时,这些精细的细节就不再重要,处理和绘制包含如此多线段的折线是十分浪费的。在本题中,我们考虑一种特定的折线简化算法,旨在用包含较少线段的折线来逼近原始折线。

一条包含 $n$ 条线段的折线由 $n + 1$ 个点 $p_0 = (x_0, y_0), \dots, p_n = (x_n, y_n)$ 描述,其中第 $i$ 条线段为 $p_{i-1}p_i$。折线可以通过移除一个内部点 $p_i$ ($1 \le i \le n - 1$) 来简化,从而将线段 $p_{i-1}p_i$ 和 $p_i p_{i+1}$ 替换为线段 $p_{i-1}p_{i+1}$。为了选择要移除的点,我们计算由 $p_{i-1}$、$p_i$ 和 $p_{i+1}$ 构成的三角形的面积(如果三点共线,则面积为 $0$),并选择使三角形面积最小的点 $p_i$。如果存在多个点的三角形面积相同,则选择索引最小的点。这一操作可以重复应用于简化后的折线,直到达到目标线段数 $m$。

考虑下面的例子。

原始折线如上图所示。考虑由 $p_2$、$p_3$ 和 $p_4$ 构成的三角形的面积(中图),如果该面积在所有此类三角形中最小,则移除 $p_3$。移除 $p_3$ 后的折线如下底图所示。

输入格式

输入的第一行包含两个整数 $n$ ($2 \le n \le 200\,000$) 和 $m$ ($1 \le m < n$)。

接下来的 $n + 1$ 行指定 $p_0, \dots, p_n$。每个点由其 $x$ 和 $y$ 坐标给出,坐标为 $-5000$ 到 $5000$ 之间的整数(包含边界)。

你可以假设给定的点在字典序上是严格递增的。也就是说,对于所有 $0 \le i < n$,有 $x_i < x_{i+1}$,或者 $x_i = x_{i+1}$ 且 $y_i < y_{i+1}$。

输出格式

在第 $k$ 行输出在上述算法的第 $k$ 步中被移除的点的索引(使用原始折线中的索引)。

样例

输入样例 1

10 7
0 0
1 10
2 20
25 17
32 19
33 5
40 10
50 13
65 27
75 22
85 17

输出样例 1

1
9
6

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.