入门题目
【UVa11178】Morley定理
由于对称性,我们只需要知道如何求点D即可
首先计算角ABC的值a,然后把射线BC逆时针旋转a/3得到直线BD,同样的可得直线CD
然后计算BD和CD的交就行了
|
|
【CF772#B】不稳定的风筝
我们先思考一个这样的问题:多边形在什么情况下会变相交?
如图所示,A、B、C是多边形上的连续顶点,我们看到,只要直径超过B到AC的距离,就会出现多边形自交的情况
所以我们只需要对于连续的三个顶点,求出其中一点到另外两点所成直线的距离,更新答案就行了
注意:INF不要开小
|
|
【LA3263】好看的一笔画
首先介绍欧拉公式:设平面图的顶点数、边数、面数分别为$V$、$E$、$F$,则有$V+F-E=2$
所以我们只需要计算出顶点数和边数就行了
注意计算线交后要去重,因为可能出现多线共点的情况
|
|
【UVa11796】狗的距离
首先看一种简化的情况:甲和乙的线路都是直线,那么根据相对运动理论,可看成甲静止不动,乙沿着直线走,即计算点到直线的最大最小距离即可
然后我们只需要模拟整个过程,处理每个拐点的情况即可
|
|
凸包
【UVa10652】包装木板
直接求凸包的面积即可
|
|
【LA2453】围墙
先求凸包,然后答案就是凸包周长+$2\pi L$
为什么是$2\pi L$呢?这个问题留个读者画图思考
另外这题卡输出格式,23333
|
|
【UVa11168】飞机场
求出点的凸包之后,我们不难发现,选择凸包的边所在的直线一定比选择其它直线更优
所以我们只需要枚举凸包上的直线,然后我们可以在$O(1)$的时间内求出总距离
设直线的一般式为$Ax+By+C$,然后使用公式$d=\frac{|Ax_0+By_0+C|}{\sqrt {A^2+B^2}}$
我们只需要预处理所有横坐标的和、所有纵坐标的和就行了
至于把两点式化为一般式,那就脑洞大开随便做了
|
|
【UVa10256】点集划分
先求出红点的凸包和蓝点的凸包,那么我们判断这两个凸包是否相离即可
具体的话就是要判断:
(1)任取两凸包上的线段没有交点
(2)任取凸包上一点,该点不在另一凸包内
|
|
半平面交
【POJ3130】数学家的难题
半平面交经典应用:判断多线性核的存在性
把多边形的边看成半平面,只需要判断交是否为空就行了
吐个槽:POJ居然不支持bits库
这道题曾出现在Pku科技营上,当时naive不会计算几何没有做出来
|
|
【LA2512】艺术画廊
半平面交经典应用:求多边形核的存在区域面积
求出半平面交后算面积就行了
|
|
【UVa10084】更冷更热
首先很显然的是:如果出现了“Same”,之后的答案就是0,这个要记得特判掉
然后没加入一个条件,就相当于增加了一个半平面:它的中垂线
求一下半平面交,然后计算面积即可
|
|
【LA3890】离海最远的点
我们先二分一个答案,然后把多边形缩一缩,判断半平面交是否非空即可
|
|
【LA2218】铁人三项
这题思路很妙啊
设比赛总长度为$k$(常数),其中游泳长度为$x$,自行车为$y$,赛跑为$k-x-y$
则选手i能打败选手j的条件为:$\frac{x}{v_i}+\frac{y}{u_i}+\frac{k-x-y}{w_i}<\frac{x}{v_j}+\frac{y}{u_j}+\frac{k-x-y}{w_j}$
整理为$Ax+By+C>0$的形式,则
$A=(\frac{k}{v_j}-\frac{k}{w_j})+(\frac{k}{v_i}-\frac{k}{w_i})$
$B=(\frac{k}{u_j}-\frac{k}{w_j})+(\frac{k}{u_i}-\frac{k}{w_i})$
$C=\frac{k}{w_j}-\frac{k}{w_i}$
这相当于一个半平面,至于打败所有人,就相当于求所有半平面的交
注意:由于精度问题,常数k建议设置为10000,且需要特判3个速度都大于/小于另一个选手的情况
|
|
【LA4992】丛林警戒队
有一个很显然的结论:炸掉连续的点一定比炸掉分散的点更优,所有我们的做法就比较显然了
首先二分一个答案,然后判断半平面交是否为空即可
|
|
旋转卡壳
【LA4728】多边形
求完凸包之后,我们的问题就变成了一个经典问题:求凸包直径
直接上旋转卡壳即可
这题数据好水,怎么写都能过
|
|
【bzoj1069】最大土地面积
按照计算几何的套路,求出凸包后,我们发现这四个点中一定包含了2个对踵点
于是上旋转卡壳求出一对对踵点后,在两侧找面积最大的三角形,然后拼在一起
找三角形时,只需要用叉积计算有向面积即可
时间复杂度:$O(n^2)$
|
|
【UVa12307】最小包围盒
旋转卡壳经典应用:求最小矩形覆盖
首先有一个结论:该矩形一定有一条边与凸包的一条边重合(想想旋转卡壳的原理就知道了)
那么我们的做法就是找到对踵点后,补全这个矩形,然后更新答案
找矩形左右极点时用点积判断,具体参见代码
然后注意:INF不要开小
这题最坑的地方就是卡精度:我的程序eps开到1e-10才过
|
|