我获得 S 的 严格凸多边形 和 Q 要处理的查询。
多边形和查询点的所有点都以(x,y)对给出。多边形的点以逆时针顺序给出。
上述变量受到限制,1<=S<=10^6
和1<=Q<=10^5
以及1<=|x|,|y|<=10^9
。
对于每个查询,如果给定的点位于多边形内,我应该输出Yes;否则,没有。
我尝试使用O(S) 包含测试 (光线投射)并且它为更大的测试用例超时但是也没有通过所有测试用例初步的。
显然,实现并没有覆盖所有边缘情况,我了解了这个问题的特定算法,它可以回答 O(log S)中的每个查询 使用二分搜索,但我无法弄清楚如何从伪代码实现它(第一次进行计算几何)。
任何人都可以向我提供算法,该算法涵盖了所需时间复杂度 (Q log S) 中的所有边缘情况,或者引导我访问实现它的页面或纸张?
答案 0 :(得分:1)
您可以执行扫描线算法。 您需要按Q坐标对Q点进行排序。 然后找到具有最低x的S点并考虑沿x轴移动的线。您需要跟踪多边形的两侧。
然后沿着多边形移动,Q设置为上升的x坐标。对于每一点,您现在只需检查它是否在您正在跟踪的两条线之间。
如果Q没有排序,复杂度为O(Q logQ + S),如果Q已经排序,则复杂度为O(Q + S)。
答案 1 :(得分:1)
首先,您可以将凸多边形分为左和右部分,从上部点开始,以下部点结束。这两个部分中的点已经按y
- 坐标
假设查询点的坐标为(qx, qy)
。现在,您可以尝试查找(使用二进制搜索) left 部分中的一个段和 right 部分中与行y = qy
相交的段。如果您可以找到这两个细分,并且qx
位于x
- 细分的坐标之间。与线y = qy
的交叉点,它在多边形内部。
查询的复杂性为O(log(S))
。
答案 2 :(得分:1)