你是否曾好奇过如何生成一个“随机”的非凸多边形?一种方法是使用 ifsmirnov 的算法。你可以在这里阅读相关内容:https://codeforces.com/blog/entry/63058#comment-472683。该算法说明如下:
设 $n$ 为多边形的顶点数。我们在正方形 $[0-10^5] \times [0-10^5]$ 内随机生成 $n$ 个点 $p_1, p_2, \dots, p_n$,方法如下:
- 对于每个点,我们从 $0$ 到 $10^5$ 之间的整数均匀分布中选择 $x$ 和 $y$;
- 如果当前点位于之前生成的任意两点所构成的直线上,则重新生成其坐标,直到它不位于任何此类直线上。
之后,我们为这些点构建一棵最小生成树,并以深度优先顺序遍历该树;当我们第一次访问一个顶点时,记录下它的编号。这个编号序列代表了这些点上的某个哈密顿回路。
接下来,我们在该回路中每对相邻点之间画一条线段。只要至少存在两条相交的线段,我们就通过交换线段端点来修复这种相交:如果相交的线段由点 $p_i, p_{i+1}$ 和 $p_j, p_{j+1}$ 构成,则擦除这些线段,并在 $p_i$ 和 $p_j$ 之间以及 $p_{i+1}$ 和 $p_{j+1}$ 之间各画一条线段。据信此过程最终会停止。
你可以下载生成器源代码以在本地生成一些样例。为此,请在 Yandex.Contest 系统中该题目的题目描述和提交表单之间,使用“Download problem statement”链接下载压缩包。
在那里,你将找到文件 gen.cpp 和 jngen.h。运行以下命令:
g++ gen.cpp -o gen./gen -n 1000 <seed>
参数 <seed> 可能包含数字、字母、空格和一些标点符号。
本题的具体要求如下:给定两个非凸多边形,它们均由 ifsmirnov 的算法生成。求它们的闵可夫斯基和(Minkowski sum)的面积。
两个多边形的闵可夫斯基和定义如下:如果点 $(x_1, y_1)$ 位于第一个多边形内部或边界上,且点 $(x_2, y_2)$ 位于第二个多边形内部或边界上,则点 $(x_1 + x_2, y_1 + y_2)$ 属于它们的闵可夫斯基和。
输入格式
第一行包含一个整数 $n$ ($n = 10^3$):第一个多边形的顶点数。接下来的 $n$ 行包含其点的坐标 $x_i, y_i$ ($0 \le x_i, y_i \le 10^5$),按遍历顺序(顺时针或逆时针)给出。
下一行包含一个整数 $m$ ($m = 10^3$):第二个多边形的顶点数。接下来的 $m$ 行包含其点的坐标 $x_i, y_i$ ($0 \le x_i, y_i \le 10^5$),按遍历顺序(顺时针或逆时针)给出。
每个多边形都是非凸的,没有自交,且不存在任意三点共线的情况。
输出格式
输出一个数字,即两个多边形的闵可夫斯基和的面积。如果你的答案的相对误差不超过 $10^{-4}$,则被视为正确。
样例
输入 1
./gen -n 1000 sample
输出 1
38851658799.3
说明
为确保无误,样例以以下内容开头:
1000 28481 58236 26391 26391 33364 59290 ...