题目链接
POJ 3304:Segments
Acwing 2984:线段
题目大意
有n条线段,给出所有线段的两端点,判断是否存在一条直线,使得所有线段到这条直线上的投影都有交点,若存在输出Yes!,否则输出No!。
思路
首先要找这条直线不好直接找,所以我们就要将问题转化一下,若存在一条直线1和所有线段都有交点,则一定存在一条和该直线垂直的直线2,使得所有线段到直线2上的投影都有交点,交点就是所有线段和直线1的交点在直线2上的投影。如下图:
那么这样就好找这条直线了,因此这就将问题转化成了求一条直线和所有线段都有交点,那么现在如何求这条直线呢?我们考虑将这条直线绕任意一点旋转,那么他一定会被一条线段所限制,他最多可旋转到某条直线的一个端点,如图:
这里的红色端点就是限制他的点,然后我们再绕该红色点旋转,一点还会有另一个蓝点来限制这条直线,如图:
因此,我们就会发现,这条直线在这种情况下一点会经过所有线段端点的某两个,因此我们只需要枚举两个点,然后再判断一次即可。那么问题来了如何判断直线是否和线段相交呢?我们可以用向量的叉积来判断,如图直线ij和线段ab相交:
做向量 j i ⃗ \vec {ji} ji和 j a ⃗ \vec {ja} ja和 j b ⃗ \vec {jb} jb