QOJ.ac

QOJ

Time Limit: 3 s Memory Limit: 1024 MB Total points: 100

#4708. 旋转切割钻头

Statistics

机床技术的发展永无止境。最近的一项提议是采用更灵活的机床,在这种机床中,不仅工件,而且切削刀头也围绕平行的轴同步旋转。当机床启动时,工件和切削刀头开始以相同的角速度旋转,即向相同的方向并以相同的转速旋转。当与切削刀头发生碰撞时,工件中与切削刀头相交的部分会被切除。

为了展示该机制的实用性,请你模拟这种机床的切削过程。

尽管工件和切削刀头的形状可能很复杂,但只需关注它们在垂直于旋转轴的平面上的横截面即可。我们在垂直于两根轴的平面上引入一个 $xy$ 坐标系,其中工件的旋转中心位于原点 $(0, 0)$,而切削刀头的旋转中心位于 $(L, 0)$。你可以假设工件和切削刀头都具有多边形横截面,但不一定是凸多边形。

注意,即使工件的这个横截面被分成了两个或多个部分,工件在其他横截面上仍然是连通的。

我们将旋转前工件内部(即在内部且不在边界上)的格点($x$ 和 $y$ 坐标均为整数的点)称为“兴趣点”,简称 POI。

我们感兴趣的是,在工件和切削刀头同时旋转 360 度后,还剩下多少个 POI。如果 POI 严格位于最终工件的内部,则称该 POI 仍然存在。请编写一个程序,计算给定工件和切削刀头配置下剩余的 POI 数量。

图 H.1(a) 展示了样例输入 1 中给出的工件(黑线)和切削刀头(蓝线)。两个圆圈表示工件和切削刀头的旋转中心。红色的十字标记表示 POI。

图 H.1(b) 展示了旋转方向为顺时针时,工件和切削刀头在旋转过程中的状态。浅蓝色区域表示被切除的区域。

图 H.1(c) 展示了该样例的结果。注意,其中一个 POI 位于最终形状的边缘上。你不应该计算该点。最终剩余了 8 个 POI。

图 H.1. 样例 1 中的工件和切削刀头

输入格式

输入包含单个测试用例,格式如下:

$M$ $N$ $L$ $x_{w1}$ $y_{w1}$ $\vdots$ $x_{wM}$ $y_{wM}$ $x_{c1}$ $y_{c1}$ $\vdots$ $x_{cN}$ $y_{cN}$

第一行包含三个整数。$M$ 是工件的顶点数 ($4 \le M \le 20$),$N$ 是切削刀头的顶点数 ($4 \le N \le 20$)。$L$ 指定了切削刀头旋转中心的位置 ($1 \le L \le 10000$)。

接下来的 $M$ 行,每行包含两个整数。第 $i$ 行包含 $x_{wi}$ 和 $y_{wi}$,表示工件第 $i$ 个顶点的坐标为 $(x_{wi}, y_{wi})$。顶点按逆时针顺序给出。

接下来的 $N$ 行是切削刀头顶点的坐标,方式相同,但坐标是相对于其旋转中心 $(L, 0)$ 的偏移量。也就是说,切削刀头第 $j$ 个顶点的坐标为 $(L + x_{cj}, y_{cj})$。

你可以假设对于 $1 \le i \le M$ 和 $1 \le j \le N$,$-10000 \le x_{wi}, y_{wi}, x_{cj}, y_{cj} \le 10000$。

工件和切削刀头在初始旋转位置的所有边都平行于 $x$ 轴或 $y$ 轴。换句话说,对于每个 $i$ ($1 \le i \le M$),$x_{wi} = x_{wi'}$ 或 $y_{wi} = y_{wi'}$ 成立,其中 $i' = (i \pmod M) + 1$。边交替平行于 $x$ 轴和 $y$ 轴。切削刀头的情况也一样。

你可以假设工件的横截面形成一个简单多边形,即除了相邻边外,没有两条边有公共点。切削刀头的情况也一样。在开始旋转之前,工件和切削刀头不接触也不重叠。

注意,$(0, 0)$ 不一定在工件内部,$(L, 0)$ 也不一定在切削刀头内部。

输出格式

输出剩余在工件内部的 POI 数量。

样例

样例输入 1

4 6 5
-2 5
-2 -1
2 -1
2 5
-2 1
-2 0
0 0
0 -2
2 -2
2 1

样例输出 1

8

样例输入 2

14 14 6000
-3000 3000
-3000 -3000
3000 -3000
3000 -2000
2000 -2000
2000 -1000
1000 -1000
1000 0
0 0
0 1000
-1000 1000
-1000 2000
-2000 2000
-2000 3000
3000 3000
-3000 3000
-3000 2000
-2000 2000
-2000 1000
-1000 1000
-1000 0
0 0
0 -1000
1000 -1000
1000 -2000
2000 -2000
2000 -3000
3000 -3000

样例输出 2

6785772

样例输入 3

12 12 11
-50 45
-50 -45
40 -45
40 25
-10 25
-10 -5
0 -5
0 15
30 15
30 -35
-40 -35
-40 45
50 -45
50 45
-40 45
-40 -25
10 -25
10 5
0 5
0 -15
-30 -15
-30 35
40 35
40 -45

样例输出 3

966

样例输入 4

20 4 11
-5 5
-5 -10
-4 -10
-4 -1
-3 -1
-3 -10
1 -10
1 -4
0 -4
0 -1
1 -1
1 0
4 0
4 -1
10 -1
10 3
1 3
1 4
10 4
10 5
0 0
3 0
3 3
0 3

样例输出 4

64

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.