相当于中学的时候学的线性规划,用n条直线去切割一个平面,每条直线代表一定的限制,最后如果有解就会在中间留下一个凸核:
- 线性规划
- 多边形的核
什么是 半平面交 ?
典型的例子 :给你一个多边形,判断多边形内是否存在一个点,从这个点可以看到多边形周围所有的点。
1. 做法:
多边形的每条边都是一个约束条件,边的顺序为顺时针
用每条边的直线去切割当前平面:枚举平面点集中的点,假如当前点(p)在核外,
判断p-1与p+1是不是在核内,如果是,则肯定有交点
分别把求出的交点加入点集
不断重复的做下去
2. 主代码
|
|
3. 更多的一些要求
- 核的面积——三角形分割
- 核的重心——重心公式
现在可以过水题了……
poj 3335
传送门:http://poj.org/problem?id=3335
poj 2451
传送门:http://poj.org/problem?id=2451
然而我们需要更快一点的算法
先引用一下nlgn算法的介绍,在zzy论文里也有详细介绍.
step1.
将所有半平面按极角排序,对于极角相同的,选择性的保留一个。 O(nlogn)
step2.
使用一个双端队列(deque),加入最开始2个半平面。
step3.
每次考虑一个新的半平面:
a.while deque顶端的两个半平面的交点在当前半平面外:删除deque顶端的半平面
b.while deque底部的两个半平面的交点在当前半平面外:删除deque底部的半平面
c.将新半平面加入deque顶端
step4.
删除两端多余的半平面。
具体方法是:
a.while deque顶端的两个半平面的交点在底部半平面外:删除deque顶端的半平面
b.while deque底部的两个半平面的交点在顶端半平面外:删除deque底部的半平面
重复a,b直到不能删除为止。
step5:
计算出deque顶端和底部的交点即可。
然后就有更多奇怪的题了
一. bzoj 1038
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1038
题意:给出一个村庄的轮廓,在这个村庄里可以在任意的地方建一个瞭望塔,这个塔需要足够高,使得能够看得村庄的全貌。求这个瞭望塔的最小高度。
思路:对于村庄中的每一条边,瞭望塔为了看见它,必须要在这个直线左侧的半平面区域。这样的话为了满足所有的边的需求,做一次半平面交,瞭望塔的最高点必须在所有边的半平面交的区域内。
二. poj 3525
传送门:http://poj.org/problem?id=3525
题意:给定一个凸多边形,求多边形中距离边界最远的点到边界的距离。
思路 : 每次将凸多边形每条边往里平移d,判断是否存在核;二分d即可。
最后是你们要的模(fu)板(li)||ヽ( ̄▽ ̄)ノミ|Ю
|
|
作者:潘喆 沈思远
2016 年 7月 11日