QOJ.ac

QOJ

実行時間制限: 1 s メモリ制限: 1024 MB 満点: 100

#947. 剪刀与胶带

統計

给定一张形状为简单多边形 $S$ 的纸。你的任务是将其转化为一个面积与 $S$ 相同的简单多边形 $T$。

你可以使用两种工具:剪刀和胶带。剪刀可以将任何多边形切割成更小的多边形碎片。胶带可以将较小的碎片组合成更大的多边形。你可以多次使用每种工具,顺序不限。

输入中的多边形具有整数坐标,但你可以在输出中生成具有非整数坐标的形状。

以下是任务的正式定义。

形状 $Q = (Q_0, \dots, Q_{n-1})$ 是平面上三个或更多点的序列,满足: 闭合折线 $Q_0Q_1Q_2 \dots Q_{n-1}Q_0$ 从不接触或自交,因此它构成了一个简单多边形的边界。 折线沿逆时针方向绕多边形边界运行。

以形状 $Q$ 为边界的多边形记为 $P(Q)$。

如果两个形状可以通过平移和/或旋转变得完全相同,则称它们是等价的。注意,不允许对形状进行镜像翻转。还要注意,点的顺序很重要:形状 $(Q_1, \dots, Q_{n-1}, Q_0)$ 不一定等价于 $(Q_0, \dots, Q_{n-1})$。

在输入和输出中,一个具有 $n$ 个点的形状由一行表示,包含 $2n+1$ 个空格分隔的数字:数字 $n$ 后跟点的坐标:$Q_{0,x}, Q_{0,y}, Q_{1,x}, \dots$

形状具有识别编号(ID)。给定的形状 $S$ 的 ID 为 0,你在解题过程中生成的形状 ID 分别为 1, 2, 3, \dots,按生成的顺序排列。

如果形状 $B_1, \dots, B_k$ 满足以下条件,则称它们构成形状 $A$ 的一个剖分 所有 $P(B_i)$ 的并集恰好是 $P(A)$。 对于每个 $i \neq j$,$P(B_i)$ 和 $P(B_j)$ 的交集面积为零。

剪刀操作会销毁一个现有的形状 $A$,并产生一个或多个构成 $A$ 的剖分的形状 $B_1, \dots, B_k$。

胶带操作会销毁一个或多个现有的形状 $A_1, \dots, A_k$,并产生一个新的形状 $B$。为了执行此操作,你必须首先指定形状 $C_1, \dots, C_k$,然后再指定最终形状 $B$。这些形状必须满足以下条件: 对于每个 $i$,形状 $C_i$ 与形状 $A_i$ 等价。 形状 $C_1, \dots, C_k$ 构成形状 $B$ 的一个剖分。

通俗地说,你选择形状 $B$,并展示如何将每个现有的 $A_i$ 移动到 $B$ 内的正确位置 $C_i$。注意,只有形状 $B$ 会获得新的 ID,形状 $C_i$ 不会。

输入格式

第一行包含源形状 $S$。 第二行包含目标形状 $T$。 每个形状包含 3 到 10 个点(含边界)。两个形状均按上述格式给出。 输入中的所有坐标均为 $-10^6$ 到 $10^6$ 之间的整数。 在每个形状中,没有三个点形成的角小于 3 度。(这包括非连续点,并暗示没有三点共线。) 多边形 $P(S)$ 和 $P(T)$ 的面积相等。

输出格式

每当你使用剪刀操作时,输出以下形式的行块:

scissors
id(A) k
B_1
B_2
...
B_k

其中 $id(A)$ 是你想要销毁的形状的 ID,$k$ 是你想要产生的新形状的数量,$B_1, \dots, B_k$ 是那些形状。

每当你使用胶带操作时,输出以下形式的行块:

tape
k id(A_1) ... id(A_k)
C_1
C_2
...
C_k
B

其中 $k$ 是你想要粘合在一起的形状数量,$id(A_1), \dots, id(A_k)$ 是它们的 ID,$C_1, \dots, C_k$ 是展示它们在 $B$ 中位置的等价形状,$B$ 是通过将它们粘合在一起获得的最终形状。

建议将点的坐标输出到至少 10 位小数。

输出必须满足以下条件: 输出中点的所有坐标必须在 $-10^7$ 到 $10^7$ 之间(含边界)。 输出中的每个形状最多包含 100 个点。 在每次操作中,形状数量 $k$ 必须在 1 到 100 之间(含边界)。 操作次数不得超过 2000。 输出中所有形状的点总数不得超过 20000。 最后,必须恰好剩下一个形状(未被销毁),且该形状必须与 $T$ 等价。

所有操作必须根据检查器有效。允许有微小舍入误差的解。(在验证每个条件时,内部所有比较都会检查绝对或相对误差是否在 $10^{-3}$ 以内。)

说明

  • 有关如何打印浮点数的说明,请参阅你所用编程语言的笔记。
  • 你可以下载二进制文件 scissors-checker,使其可执行(chmod a+x scissors-checker),并在本地使用它来检查输出的正确性(./scissors-checker input your_output)。

子任务

如果形状的形式为 $((0, 0), (x, 0), (x, y), (0, y))$ 且 $x, y$ 为正整数,则称该形状为优美矩形。 如果此外 $x = y$,则称该形状为优美正方形。 如果多边形 $P(A)$ 的所有内角均小于 180 度,则称形状 $A$ 为严格凸的。

  • 子任务 1(5 分):$S$ 和 $T$ 是优美矩形。所有点的坐标均为 0 到 10 之间的整数。
  • 子任务 2(13 分):$S$ 是 $x > y$ 的优美矩形,$T$ 是优美正方形。
  • 子任务 3(12 分):$S$ 和 $T$ 是优美矩形。
  • 子任务 4(14 分):$S$ 是三角形,$T$ 是优美正方形。
  • 子任务 5(10 分):$S$ 和 $T$ 是三角形。
  • 子任务 6(16 分):$S$ 是严格凸多边形,$T$ 是优美矩形。
  • 子任务 7(11 分):$T$ 是优美矩形。
  • 子任务 8(19 分):无额外限制。

样例

样例输入 1

6 0 0 6 0 6 4 5 4 5 9 0 9
4 0 0 7 0 7 7 0 7

样例输出 1

scissors
0 5
3 0 0 3 0 3 4
3 3 4 0 4 0 0
3 3 0 6 0 6 4
3 6 4 3 4 3 0
4 0 4 5 4 5 9 0 9
tape
5 1 2 5 3 4
3 0 3 0 0 4 0
3 4 0 7 0 7 4
4 0 3 4 0 7 4 3 7
3 7 4 7 7 3 7
3 3 7 0 7 0 3
4 0 0 7 0 7 7 0 7

样例输入 2

4 0 0 3 0 3 3 0 3
4 7 -1 10 -1 11 2 8 2

样例输出 2

scissors
0 2
3 0 0 1 3 0 3
4 1 3 0 0 3 0 3 3
tape
2 1 2
3 110 -1 111 2 110 2
4 108 2 107 -1 110 -1 110 2
4 107 -1 110 -1 111 2 108 2

样例输入 3

4 0 0 9 0 9 1 0 1
4 0 0 3 0 3 3 0 3

样例输出 3

scissors
0 2
4 1.47000000000 0 9 0 9 1 1.470000000 1
4 0 0 1.470000000 0 1.470000000 1 0 1
scissors
1 2
4 1.470000000 0 6 0 6 1 1.470000000 1
4 9 0 9 1 6 1 6 0
tape
2 4 3
4 3 2 3 1 6 1 6 2
4 6 1 1.470000000 1 1.470000000 0 6 0
6 1.470000000 0 6 0 6 2 3 2 3 1 1.47 1
scissors
5 4
4 1.470000000 0 3 0 3 1 1.470000000 1
4 3 0 4 0 4 2 3 2
4 4 2 4 0 5 0 5 2
4 5 0 6 0 6 2 5 2
tape
5 2 6 7 8 9
4 0 0 1.470000000 0 1.470000000 1 0 1
4 1.470000000 0 3 0 3 1 1.470000000 1
4 0 2 0 1 2 1 2 2
4 0 2 2 2 2 3 0 3
4 3 3 2 3 2 1 3 1
4 0 0 3 0 3 3 0 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.