题意
- 给出两堆点,问是否存在一个圆,能把其中的一堆全部包含进去但另外一堆全部在圆外面。
思路
这题当时比赛的时候没有人写出来。赛后的题解也迟迟没有给出。给出的题解我只看懂了前半部分。。后半部分应该是比较屌的东西。我的代码还是参考了别人AC的代码写的。思路就是固定两个点,然后对于这一堆点,我们可以求出一个最大半径和一个最小半径,而对于另外的点,我们可以逐个对这个最大和最小半径(其实是圆心到两点中点的距离)进行更新。如果更新到最后,最大半径和最小半径之间仍有范围,那么说明这种情况有解。我能想到枚举所有两个点的组合,但是不知道为什么向代码里这样递归写是正确的。。这题细节颇多,其实就是对方向要有一个很好的认识。。感觉是一道不错的计算几何题目。。
题解翻译
- 看到半夜,终于看懂题解后半部分的意思。真的是太巧妙了,值得去写一个中文版。
- 首先,我们建立一个空间坐标系,也就是在原坐标系上加上z轴
画出一个曲面 z=x2+y2 ,然后我们把给定的所有点都投影到这个曲面上。即 (x,y,x2+y2) - 然后我们会发现一件事情,即任意一个不垂直于xoy平面的平面,和这个曲面相交得到的曲线,在xoy平面上的投影都是一个圆。
这是可以证明的,联立