本题题意简单:给出两组大小为n的点集,问点集A中任取三点形成的三角形围住点集B中点的数量,以及B包A的数量。
其实题目可以进一步简化:我们来看一幅图(样例解释)
我们可以主观感受一下,红点被蓝点包了一个,蓝点被红点包了俩。
回想一下,我们是怎么判断的呢?一个个三角形枚举吗?$\sf\color{red}\text{并不是!}$
多感受几次,我们发现:如果一个点被异色点围成的一个多边形围住,那么它就被捕了(如下图)。但是为什么?
别忘了,当你把所有可能的三角形围出来的时候,就注定把这些点围成的多边形覆盖,因为所有的三角形边中一定包含了这个多边形的边。还是以图举例。
显然这个五个点围出了五边形(为了美观,有部分三角形未画出)
直入主题,这样的多边形我们称之为$\sf\color{red}\text{凸包}$。那么我们现在需要的就是判断点是否在凸包内
了。
关于凸包,网上已有详细的讲解,此处不作赘述。
那么此题中,我们采用的是常规的二分判断叉积法判断。
1 | //取其中的一个点,他和其他点可以组成n-2个三角形,利用二分判断差积, |
那么有了判断法,我们就先求出AB两点集的凸包,并且用对集的点一个个代入判断即可,这是思维量最小的方式。
- 不得不提的一点:此题的边界不算入内,有一个点恰好点在凸包边界上,不能计入内。
为不影响阅读,完整代码请移步此处