半平面交小记
一个连半平面交都不会的选手怎么走到现在没被创死的?
以下用向量组 \((\vec{x_{st}},\vec{x_{en}})\) 表示直线,\(\times\) 表示叉积。
顾名思义需要求一车半平面的交集,假设我们求的都是直线的左半平面,如果是右半平面只需要把直线两个向量换个位置就依然可以套板子(
首先按照极角排序,类似于凸包,但是不同的是如果极角相同就只保留最左边的直线因为显然限制最紧。
然后增量法构造,首先我们只考虑极角大的直线对极角小的直线的限制,维护双端队列,考虑队尾的直线啥时候会似,应该是队尾的直线和队尾前面一条直线的交点在当前直线的右侧就会似。贺一张 oi-wiki 的图:
这个图中假设 \(\vec a\) 和 \(\vec b\) 已经入队,然后新增 \(\vec c\) ,因为 \(D\) 点在 \(\vec c\) 的右侧,所以 \(\vec b\) 就似了。
而当新增的直线的极角快绕回来的时候,就会对队首产生影响,再贺一张图:
如果 \(\vec f\) 是当前加入的直线,因为 \(G\) 在 \(\vec f\) 右侧,所以 \(\vec a\) 就似了,也可以类似队尾判断。
最后我们只考虑了极角大的对极角小的的影响,而没有考虑小对大的影响,因此我们考虑也按照上面用队首对队尾弹一弹就好了。
时间复杂度 \(O(n\log n)\)。
我们好像漏了一个问题:交点怎么求?
直接解析这种垃圾有一车问题,我们不用。
这篇题解 讲的比较清楚,大概就是确定用面积比确定线段比,就可以求出交点。
例题 大概就是求出半平面交以后叉积算下面积就好了。

浙公网安备 33010602011771号