QOJ.ac

QOJ

时间限制: 2 s 内存限制: 1024 MB 总分: 100

#6375. LaLa 与魔法阵 (LaLa Version)

统计

LaLa 在她的实验室里有一堆魔法圆。

一个魔法圆可以用一个用特殊墨水绘制的简单多边形来表示,当且仅当它是凸多边形时,它才是可用的。也就是说,其所有内角均小于或等于 $\pi$。

LaLa 计划将每个魔法圆都变成可用的。然而,如果操作不当,它可能会失去所有的魔法力量。幸运的是,LaLa 有一个完美的魔法工具来处理这个问题。

该工具的工作原理如下:当你放入一个魔法圆时,如果它是可用的,工具会报告它是可用的。否则,它会选取两个不同的点 $u$ 和 $v$,使得:

  • $u$ 和 $v$ 位于该魔法圆凸包的边界上,并且
  • 在魔法圆边界上从 $u$ 到 $v$ 的逆时针路径中,除了 $u$ 和 $v$ 之外,没有任何点位于该魔法圆凸包的边界上。

然后,它将 $u-v$ 路径绕 $u$ 和 $v$ 的中点旋转 $\pi$。换句话说,对于 $u-v$ 路径上的每个点 $w$,$w$ 变为 $u + v - w$,其中加法是在绘制魔法圆的二维坐标系上按坐标进行的。注意,此修改的结果也是一个简单多边形。

LaLa 对转换它们所需的时间感到厌烦。为了尽快完成并去小睡一会儿,LaLa 观察到了以下几点:

  1. 一个魔法圆总能在有限次使用该工具后变成可用的。
  2. 最终魔法圆上的点集与中间的修改过程无关。换句话说,最终魔法圆的形状和位置是初始魔法圆的函数。

因此,LaLa 不必手动使用工具将魔法圆变成可用的。相反,LaLa 将计算可以通过一系列工具修改从初始魔法圆得到的可用魔法圆,并一次性完成修改。

编写一个程序来帮助 LaLa 计算最终的魔法圆,这样她就可以去小睡了。

输入格式

输入格式如下:

$N$ $x_0 \ y_0$ $x_1 \ y_1$ $\vdots$ $x_{N-1} \ y_{N-1}$

其中初始魔法圆是连接点 $(x_i, y_i)$ 和 $(x_{(i+1 \pmod N)}, y_{(i+1 \pmod N)})$ 的 $N$ 条线段的并集,对于所有整数 $0 \le i < N$。

输入满足以下约束:

  • 输入中的所有数字均为整数。
  • $3 \le N \le 100\,000$
  • 对于所有整数 $0 \le i < N$,满足 $0 \le x_i \le 300\,000$ 且 $0 \le y_i \le 300\,000$。
  • 对于所有整数 $0 \le i < j < N$,满足 $x_i \neq x_j$ 或 $y_i \neq y_j$。
  • 输入定义了一个简单多边形边界的逆时针遍历。特别地,它不会自交。

输出格式

输出应采用以下格式:

$M$ $z_0 \ w_0$ $z_1 \ w_1$ $\vdots$ $z_{M-1} \ w_{M-1}$

其中最终的可用魔法圆是连接点 $(z_i, w_i)$ 和 $(z_{(i+1 \pmod M)}, w_{(i+1 \pmod M)})$ 的 $M$ 条线段的并集,对于所有整数 $0 \le i < M$。

输出应满足以下约束:

  • 输出中的所有数字均为整数。
  • 点 $(z_0, w_0)$ 在字典序上小于所有整数 $1 \le i < M$ 的点 $(z_i, w_i)$。即 $(z_0 < z_i)$ 或 $(z_0 = z_i \text{ 且 } w_0 < w_i)$。
  • 对于所有整数 $0 \le i < M$,点 $(z_i, w_i)$、$(z_{(i+1 \pmod M)}, w_{(i+1 \pmod M)})$ 和 $(z_{(i+2 \pmod M)}, w_{(i+2 \pmod M)})$ 不共线。
  • 输出定义了一个凸多边形边界的逆时针遍历。

可以证明满足上述约束的输出是唯一的。

样例

样例输入 1

8
1 0
4 0
6 0
3 1
5 2
2 1
6 3
0 2

样例输出 1

6
0 2
1 0
6 0
12 3
9 4
3 3

说明

下图展示了第一个样例的初始魔法圆。

下图展示了使用工具使其变为可用状态的序列。边界上的虚线部分是工具修改的路径,修改后变为红色部分。

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.