P9892 [ICPC 2018 Qingdao R] Mirror

题目描述

在一个无限二维平面上包含一个不透明障碍物和一个单面镜子。障碍物被表示为一个三角形,而镜子被表示为一个从点 $(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 走过的路径,对于路径上的每一个点 $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}$,则认为你的答案是正确的。

说明/提示

We now welcome our special guest Mashiro, who heartily donates this problem to our problemset, to explain the sample test cases for us using her sketch book. ![](https://cdn.luogu.com.cn/upload/image_hosting/wsxbrf43.png) ![](https://cdn.luogu.com.cn/upload/image_hosting/d2bpz78p.png) ![](https://cdn.luogu.com.cn/upload/image_hosting/nfhakntz.png) $\textit{(Image from pixiv. ID: 32084305)}$ In the figures above, we indicate the start point as point $A$ and the target point as point $B$. The mirror is indicated by the line segment pointing from $M1$ to $M2$, with the right side being reflective. For the first sample test case, the optimal path is $A \to C \to B \to C \to A \to C \to B$. For the second sample test case, as DreamGrid cannot see $A$ from $B$, it's impossible to move all the two stones from $A$ to $B$ while following the constraints in the problem description.