EnclosingTriangle

作者:叶芃

关键词:计算几何 单调性 计数 前缀和

题目简述

给定由

个点围成的正方形。正方形内部有若干个点(不超过20个,不在边界上,点的坐标都是整数),要求在正方形上选取三个点并且给定的点都在这三个点围成的三角形内部或边上,求选取这三个点的方案数。()

算法

先考虑如何判断一个点在内部或边上。设该点为,则根据叉积的知识,只需判断即可,也就是的左侧。

朴素的做法便是先将点按逆时针编号,并按编号从小到大枚举,保证三个点的编号递增,并判断所有点是否在这个三角形内。

,设给定的点为,对于一个点,满足的点的编号显然是一段区间,因为我们是逆时针编号,设满足条件的最大编号的点为,则对于任意编号介于之间的点,在左侧的点也会在左侧,同理,满足的点的编号也是一段区间。设对于第号点上述两个区间分别为,可以发现均是单调不减的,同样因为我们是逆时针枚举点,以为例,设之后的点为,那么在左侧的点也会在左侧,同理。于是我们就可以利用单调性在的时间内求出(是一定存在的,对于,若不存在,为方便起见,令)。

假设我们已知两个点,那么必然有,对于,首先可以知道,而换个角度对考虑,得到。这样一来所有条件都满足了。而由于,于是。我们要求的答案即

注意到在上式中,有,我们对于的情况单独计算,则只需求

由于是单调不减的,我们可以在枚举的时候维护一个变量,表示最小的满足的编号。那么对于,若则该式为0,否则为,这样一来,我们只需要再预处理出的前缀和就可以计算,时间复杂度降为,已经可以通过所有数据。

事实上,若给定点集的数量再扩大(例如扩大到),也是可以做的。这时只需求出给定点集的凸包,在求时利用凸包的单调性维护到两条直线的最近点即可,时间复杂度为,其中表示给定点集的大小。

results matching ""

    No results matching ""