QOJ.ac

QOJ

Límite de tiempo: 15 s Límite de memoria: 1024 MB Puntuación total: 100

#6133. 镜子

Estadísticas

在一个无限的二维平面上,存在一个不透明的障碍物和一个单面镜。障碍物可以表示为一个三角形,镜子可以表示为一个从 $(x_{m,1}, y_{m,1})$ 指向 $(x_{m,2}, y_{m,2})$ 的有向线段,其右侧具有反射性。

有 $m$ 块石头位于点 $(x_1, y_1)$,DreamGrid 想要将所有石头移动到点 $(x_2, y_2)$。必须满足以下约束:

  • DreamGrid 每次只能携带一块石头。
  • 一旦 DreamGrid 捡起一块石头,他只能将其放下在点 $(x_2, y_2)$。
  • 设 $L$ 为 DreamGrid 行走的路径,则对于 $L$ 上的每一点 $p$,DreamGrid 都应该能直接或通过镜子看到所有的石头。

注意:

  • 如果视线的一部分在障碍物内部(视线穿过障碍物的点或边是可以的),则认为 DreamGrid 无法通过该视线看到石头。
  • 如果镜子的两个端点之一在视线上,则认为 DreamGrid 既可以通过镜子看到石头,也可以透过镜子看到石头。
  • 反射过程遵循物理定律——入射角等于反射角。入射光线与反射光线相对于镜子位于同一半平面。
  • 如果视线与镜子平行,则不会发生反射,且镜子不被视为障碍物。
  • DreamGrid 不能进入障碍物内部,但可以在障碍物的边或顶点上移动。
  • DreamGrid 不能穿过镜子,但可以在镜子上移动。注意,如果 DreamGrid 在镜子的线段上(非两个端点),他只能看到他来时的那一侧,而不能透过镜子看到另一侧。

DreamGrid 想要知道将所有石头从 $(x_1, y_1)$ 移动到 $(x_2, y_2)$ 的最短距离。

输入格式

输入包含多组测试数据。第一行是一个整数 $T$(约 100),表示测试数据的组数。对于每组测试数据:

第一行包含一个整数 $m$ ($1 \le m \le 10^6$),表示石头的数量。 第二行包含四个整数 $x_1, y_1, x_2$ 和 $y_2$,表示起点和目标点。 第三行包含四个整数 $x_{m,1}, y_{m,1}, x_{m,2}$ 和 $y_{m,2}$,表示镜子的坐标。 接下来的 3 行,每行包含两个整数 $x_i$ 和 $y_i$,表示障碍物的顶点坐标。

所有坐标的绝对值均不超过 100。起点和目标点均在障碍物和镜子之外。镜子和障碍物没有公共点。 保证任意三点不共线。

输出格式

对于每组测试数据,输出一个实数表示最短距离,如果 DreamGrid 无法在满足约束的情况下移动所有石头,则输出 $-1$。

如果你的答案的绝对误差或相对误差小于 $10^{-6}$,则视为正确。

样例

输入 1

2
2
-2 0 2 0
-3 3 3 3
0 1
-3 -2
3 -2
2
-2 0 2 0
-3 3 -1 3
0 1
-3 -2
3 -2

输出 1

13.416407864999
-1

说明

我们欢迎特邀嘉宾 Mashiro,她慷慨地将此题捐赠给我们的题库,并使用她的速写本为我们解释样例测试用例。

在上图中,我们将起点标为点 $A$,目标点标为点 $B$。镜子由从 $M1$ 指向 $M2$ 的线段表示,右侧具有反射性。

对于第一个样例测试用例,最优路径为 $A \to C \to B \to C \to A \to C \to B$。

对于第二个样例测试用例,由于 DreamGrid 无法从 $B$ 看到 $A$,因此在遵循题目描述中约束的前提下,不可能将两块石头从 $A$ 移动到 $B$。

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.