计算几何 学习笔记

发现自己对计算几何一无所知。
例题1:mdoi balance
题目的公式可以视为两个点\((p_i,a_i)\)\((-q_i,-b_i)\)的连线的斜率。
由于\(p_i,q_i\geq 0\),所以\((p_i,a_i),(-q_i,-b_i)\)在以\(y\)轴分割的半平面的左/右边。
一条直线的排名等于\((以y轴分割的半平面的左边和直线的上部半平面的交的点数,以y轴分割的半平面的右边和直线的下部半平面的交的点数)\)
如果固定截距,则可能符合条件的直线可以通过nth_element快速算出,找到\((0,z)\)左半平面逆时针第\(a\)个点即可。
引理:当\(z\)增大时,\((0,z)\)左半平面逆时针第\(a\)个点与\((0,z)\)斜率减小。
证明:当\(z\)增大时,\((0,z)\)与右半平面上连接的点的斜率显然会减小,所以\((0,z)\)左半平面逆时针第\(a\)个点与\((0,z)\)斜率会减小。
所以直线的斜率会变小。
而且以y轴分割的半平面的左边和直线的上部半平面的交的点数随着\(z\)的变小,斜率的变小,会减少。
所以得证。
于是可以二分\(z\)判定。
例题2:最大土地面积
发现所有点都在凸包上。
考虑枚举对角线,则两半是独立的。
我们需要求出距离一个对角线最远的点,且要支持\(O(1)\)移动对角线的一个端点。
发现随着对角线端点的移动,距离对角线最远的点也是单调移动的。
所以可以\(O(1)\)修改。
时间复杂度\(O(n^2)\)
例题3:[JSOI2007]合金
经典模型,在BOI2020 某题中也看到了。
SCOI2018出现了该题的加强版。
首先把\((x,y,z)\)变成\((1,\frac{y}{x},\frac{z}{x})\)
把一个材料视为\((\frac{y}{x},\frac{z}{x})\)这个点。
引理:一个点集能够合成的合金就是它的凸包。
证明:两个点能够合成的合金在它们的连线上。
发现多边形内部的每个点都能用两个凸包边上的点合成。
任意引出一条经过当前点的直线,取多边形的边的交点合成即可。
问题转化成选出最少的点,使得这些点的凸包包含全部关键点。
发现如果这些点组成凹多边形,肯定不如组成凸多边形多。
考虑射线法,从某一关键点引出一条射线肯定与多边形有交,这说明每个点都要在多边形所有边的右侧。
构造一张图,如果所有关键点在向量一侧,则两个点有边,否则两个点没有边。
可以最小环解决。
效率\(O(n^2(n+m))\)
例题4:[HAOI2011]防线修建
动态凸包模板题。
维护极角序。
考虑插入当前点后什么点会被删除。
可以找到极角的前驱和后继。
然后使用叉积判定。
如果要可持久化,需要用可持久化平衡树维护。
被分裂出的肯定在凸包上是连续的一段,所以可以用平衡树维护。
例题5:高塔与晶石
先二分,问题转化成询问面积\(\leq k\)的三角形个数。
根据joisc某题技巧,按照极角序枚举一个点和它连出的底边。
三角形面积=底\(*\)高/2,如果我们知道高\(\leq 一个值\)的点的个数,我们就可以算出答案。
考虑维护叉积(底\(*\)高)的有序序列,则显然二分一下就可以得到答案。
但是直接做时间复杂度比暴力还差。
把向量两两拿出来按照极角排序,
例题6:HNOI矿区
平面图转对偶图的方法:把每条边拆成2条,使得每条边都属于一个面。
然后把每个点的所有出边按照极角排序。
对于每条边,二分出它按照极角的下一条边。
如果我们得知了每条边的下一条边,则按照"下一条边"构成的若干个环走,则形成了对偶图。
构建对偶图后,把每条原图的边对应的面连边。
找无穷域可以判定面积是否\(<0\)
考虑如何回答询问。
可以求出对偶图的生成树。
对于所有询问边,如果连接两条非树边则不管。
否则加上"有向子树大小",就是从如果左到右则ans+=子树大小否则-=子树大小
例题7:wc2013 平面图
平面图上点定位可以扫描线。
在扫描线移动时,点的顺序是不会变的。
在查询时可以平衡树上二分。
例题8:Lost My Music
经典问题,有多种做法
首先把式子转化为\(\frac{c_u-c_v}{d_u-d_v}\)
其中\(d\)为点距离根节点的距离
事实上,我们要寻找一个点和若干个点的斜率的最小值。
这可以再凸包上求切线 。
我们需要维护根到某个点的凸包。
显然可以在弹栈时撤销,然而时间复杂度是错误的。
靠谱做法有如下几种:
1.二分凸包
被删除的点在凸包内水平序肯定是连续一段,所以可以二分弹
2.有根树点分治
维护根到重心的凸包,用根到重心的每个点更新子树。
3.倍增
构造一棵树,使得沿着这颗树的父亲跳,把沿途的序列记下来,是以这个点为结尾的凸包。
被删除的点在凸包内水平序肯定是连续一段,可以倍增出。
事实上这个做法的思想和二分凸包是差不多的。
例题9:3D Histogram
运用极大化思想,题目的贡献就是\((r-l+1)*\min(a_{l...r})*min(b_{l...r})\)
考虑分治。
这样子最小值就拆成了左/右两部分
可以枚举最小值在哪里取到。
1.都在右边取到
显然\(r-l+1\)越大越好,就是\(l\)越小越好
2.一个在左边,一个在右边
事实上\(l\)取值范围是一个区间,可以线段树+凸包查询。
3.都在左边
\(l\)取值是一个前缀,可以线段树+凸包。
实际上,多维也是可做的。
枚举最小值的位置。
维护\(2^d\)颗线段树然后查询。
时间复杂度\(O(2^dn\log_2^3n)\)或者\(O(2^dn\log_2^2n)\)
例题10:【GDOI2004】可怜的绵羊
又是水题
凸包求面积,可以钦定一个点在凸包上,然后三角剖分
钦定一个点在凸包上,求出它的答案。
考虑dp,设\(f_i\)表示按照极角排序后dp到点\(i\)的答案。
转移枚举上一个点\(j\),要求三角形内没有点即可。
预处理三角形内是否有关键点可以叉积。
例题11:【GDSOI2017】魔兽争霸 x
abns弱化版。。。。
有一结论:最多只会用两种技能。
可以考虑像jsoi合金一样证明。
\(O(n^2)\)枚举技能
列方程\(\min(\frac{hp-xa_i}{a_j},\frac{mp-xb_i}{b_j})c_j+xc_i=y\)
y是权值和。
分类讨论\(\min(\frac{hp-xa_i}{a_j},\frac{mp-xb_i}{b_j})\)的取值。
\(\frac{hp-x*b_i}{b_j}<\frac{mp-x*b_i}{b_j}\)时会选左边,否则选择右边。
解得分界线\(z\)\(\frac{mpa_j-hpb_j}{b_ia_j-b_ja_i}\)
\(x<z\)\(x\geq z\)时可以得到\(x\)的值。
解得的结果是一次函数。
可以根据斜率知道哪个更优
效率\(O(n^2)\)
例题12:杂题
例题13:[ZJOI2008]瞭望塔
求出什么时候某个折线上部分才能被看到。
显然是一个半平面
直接半平面交即可。
例题14:人烟之山
显然是半平面交+线段树二分。
根据例题13的经验,求出什么时候某个折线上部分才能被看到。
显然是一个半平面。
考虑线段树二分。
先二分出瞭望台在哪个折线上。
然后往左/右线段树二分。
维护区间的半平面的交。
每次查询半平面交在当前位置的取值是否>高度即可。
效率\(O((n+m)\log_2n)\)
例题15:[SDOI2013] 逃考
半平面交/voronoi图应用。
建立v图可以用半平面交。
事实上,两个亲戚控制的区域由其连线的中垂线构成的半平面分割。
可以用半平面交求出一个点周围控制的区域。
然后把相邻的区域之间连1权边,跑最短路即可。
例题16: [POI2009]WSP-Island
有意思的题。
发现如果\(a\)能够直接走到\(b\),则任何\(a\)\(b\)的间接路径都不如这条路径优。
答案等于没有被删除的直线的半平面交。
这样子有\(O(n^2)\)条直线,太慢了。
一个点\(x\)连出的所有直线显然只有连出编号最大的才有用,所以每个点最多只会连出\(O(n)\)条有效的直线。
例题17: [SCOI2015]小凸想跑步
例题18:[JSOI2010]冷冻波
先二分,发现二分后一个人能够打的精灵个数是确定的。
判定一个人是否能够打到精灵,可以求出距离。
判定是否和树木相交,可以求出点到直线距离,判定是否小于圆心到直线。
考虑网络流构图:\(s\to 每个人连能够打到精灵的个数\)的边。
如果\(x\)能够打到\(y\),则\(x\to y\)\(1\)
\(y\to 汇点\)\(1\)
判定是否满流即可。
例题19:星座
根据某cf题的经验,有解时所有点在凸包上是连续的。
证明可以归纳。
可以dp计算。
例题20:两个人的星座
如果三角形有且只有两条内公切线,则合法。
考虑极角扫描。
枚举内公切线的一个端点,关于这个端点建立平面直角坐标系。
把其他点按照极角排序。
按照排序顺序枚举所有点,发现所有三角形要在半平面的两边。
在扫描时显然可以快速维护半平面两边的所有颜色的点数。
计算三角形点数,可以把半平面一边和原点不同颜色的点数乘起来。
然后把半平面两部分的点数乘起来就是答案。
效率\(O(n^2\log_2n)\)
例题21:[SCOI2014]舌尖上的方伯伯
例题22:dragon 2
经典模型:如果关于两个集合的询问可以在\(O(\min(sz(A),sz(B)))\)的时间内解决,则问题可以在\(O(n\sqrt{n})\)的时间内解决。
例子有coci某题。
方法是对于\(\min(sz(A),sz(B))<\sqrt{n}\)时直接查询,\(\geq \sqrt{n}\)时记忆化。
时间复杂度正确性可以放缩。
考虑如何快速求。
事实上,一个点能够被贡献的区域是三个半平面的交。
假设道路是AB,当前点是C。
则是AC延长线,AB,BC延长线三个半平面的交。
考虑按照AB两侧分类讨论。把每个点D的属性设为AD,BD和AB的夹角。
然后可以二维数点。
对每个集合建立可持久化线段树,然后将极角离散化即可
例题23:[WC2012]记忆中的水杉树
例题24:[JSOI2016]炸弹攻击2
例题25:CEOI2020道路
例题26:jsoi 绝地反击
又是裸题。
显然先二分。
转化成有若干个区间,看是否存在一种方案,使得关键点能和区间匹配上。
考虑移动圆上的点。
发现如果钦定最优方案上某个点在某个区间的端点上,答案是不会变的。
可以每次暴力匹配。
考虑扫描线。
每次最多只会删除一个匹配。
可以退流。
例题27:卫星基站建设
例题28:破坏蛋糕
例题29:破坏发射台
例题30:ABNS
合金加强版
例题31:经典问题
支持插入/删除的半平面交,但是斜率种类比较少。
显然对于每种斜率只需要保留最上面的一条直线即可。
例题32:GDOI2019 D2B
总结:计算几何十分套路
在考场,所有人应该能够/不能够做出来。
例题33:PKUSC
又是裸题。
可以以原点基准,把多边形三角剖分。
然后事实上我们要计算的是一个点在三角形内的概率。
这事实上可以用点绕源点运动的圆弧和三角形的交来描述。

posted @ 2021-04-06 10:53  celerity1  阅读(143)  评论(0编辑  收藏  举报