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 观察到了以下几点:
- 一个魔法圆总能在有限次使用该工具后变成可用的。
- 最终魔法圆上的点集与中间的修改过程无关。换句话说,最终魔法圆的形状和位置是初始魔法圆的函数。
因此,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
说明
下图展示了第一个样例的初始魔法圆。
下图展示了使用工具使其变为可用状态的序列。边界上的虚线部分是工具修改的路径,修改后变为红色部分。