Geometry / Numerical Methods tasks: Solution Set
Geometry / Numerical Methods tasks
对这篇深度好文的拙略模仿。
14946. Collision Damage
Collision Damage
给两个凸包
P 和Q ,记所有能让Q 通过平移与P 相交的向量集为D ,f(\bm{t}) 表示Q 通过\bm{t} 平移与P 相交的面积,求\frac{1}{|D|}\iint_{D} f(\bm{t}) 。
答案就是
16202. 公园
公园
给定平面上
n 个点(路灯),以及一个矩形区域R:[0,X]\times[0,Y] 。对于矩形内任意一点
P ,记其到第k 个路灯的距离为d_k(P) 。若某个点P 满足:对于指定的编号i 和排名j ,d_i(P) 在所有距离中是第j 小(即恰有j-1 个距离严格小于它),则称P 为一个好点。对所有
(i,j),\,(1\le i,j\le n) ,求矩形内所有满足条件的好点所构成区域的面积。
固定
观察到每条直线会产生如下贡献:
- 维护一个凸包的集合
S ,初始时S 仅包含地图矩形; - 逐条加入直线
\ell_k ,令S 中近P_k 侧的凸包的j 增加1 ; - 对于跨过直线的凸包,用 convex cut 分成两半并更新其中一半的
j ; - 加入所有直线之后,遍历
S 中的凸包,将凸包的面积累加到(i,j) 的答案上。
时间复杂度毛估估是
还有一个问题就是多次求交点(i.e., convex cut 的时候用凸包上的点和直线求交)有累计误差会爆炸。解决方案是记录下凸包上的边对应的是哪条直线
10105. Circular Parterre
Circular Parterre
给定平面上
n 个喷头,每个喷头能覆盖一个圆形区域。要求构造一个尽可能大的圆,使得该圆内的每个点,都至少被某一个喷头覆盖。输出该满足条件的最大圆。
详细版题解
Sketch: 圆弧不会产生限制,因此求出圆并的顶点,再对这些顶点求出 V 图,答案的圆心一定在 V 图顶点上。对每个 V 图顶点判断是否在圆并顶点多边形内即可。
朴素实现时间复杂度
9808. Fragile Pinball
Fragile Pinball
给定一个有
n 条边的凸多边形,有一个沿直线运动的弹球,如果遇到边界时可以选择做反射,如果同时在两条边上可以选择做反射边界及其顺序,但是每条边只能反射一次弹球。对每个k=0,1,\cdots,n 计算弹球被反弹至多k 次时,弹球在凸多边形内可以行进的最长路程。
枚举反射的边的顺序,按照顺序将多边形做一系列对称,相当于将弹球的路径展开成一条直线。即需要求一条最长直线经过所有反射边和起始/目标多边形。
此时得到的多边形可能是自相交的,但是自交的部分一定不会对答案产生影响(直线扫不到),因此还是可以使用类似于机场建设的分析方法得到结论:弹球路径至少经过以下两个不同的点,起始多边形的顶点、目标多边形的顶点、沿途反射边的端点。
枚举直线并求出与两个多边形的交点,再判断这条直线是否经过所有反射边,时间复杂度
9037. Ancient Maps, Hidden Danger
Ancient Maps, Hidden Danger
给出
m\,(m\leq 30) 个不交简单多边形(总点数n\leq 90 ),从无限远的所有方向打光,求出多边形遮挡的阴影面积。
记录一下怎么完成这个毒瘤题的。阴影面积不好算,考虑算被照亮的面积,如果点
思考点
- 线段
\overline{AP} 不与任何边相交,不经过任何多边形内部 - 射线
\overrightarrow{AP^\prime} 不与任何边相交/经过多边形内部,P^\prime 是P 关于A 的对称点
枚举每个顶点
接下来计算一个极角区间能够被照亮多少,假设这个区间的两个向量是
如果反向射线没有相交,那么找到与
以多边形的每个顶点为原点,能够找出
然后就是一些 corner case,大概有这些:
- 怎么判断线段在多边形外?把逆时针多边形改成顺时针,然后判断线段是否在多边形内部就行;需要处理好线段恰好跨过顶点/和边界共线的情况
- 极角扫描线的时候注意区间退化的情况
- 如果有多边形是三角形,上面的算法可能会把这个三角形当作照亮面积;一个不用动脑的解决方案是把多边形也丢在一起求并
- 三角形的顶点是两条直线的交点,求三角形并还要再次求交点,两重交点可能会爆精度;注意到三角形的边的直线是两个整点产生的,拿这两个整点用于后续求交可以优化精度
时间复杂度瓶颈在于求面积并,由于有
9049. Machine Learning with Penguins
Machine Learning with Penguins
给出三维空间中的
n 个点,判断能不能找到一个底面在z 平面的的圆柱体,使得n 个点都在圆柱体表面。
可以把圆柱的顶面调整到
分类讨论:
如图,
卡精度,需要全整数实现,精度要求最高的地方在于判断点
9728. Catch the Star
Catch the Star
给定
n 个凸形障碍M_i 和一个目标多边形S ,求出线段\overline{(l,0)\,(r,0)} 上能够完整看到S 的位置的长度。
对于每个障碍
那么
注意由于遮挡的位置是开区间,因此可能能够完整看到
10479. The Farthest Point
The Farthest Point
分类讨论。
9576. Ordainer of Inexorable Judgment
Ordainer of Inexorable Judgment
那维莱特。
9554. The Wheel of Fortune
The Wheel of Fortune
一个匀质凸多边形转盘由旋转中心划分得奖区域。当转盘的重心不在旋转中心时,转盘永远会停留在重心在最低点处,被向下的指针指向。
一个点配重
w 将会被均匀随机放在转盘上。问每个区域成为获奖区域的概率。转盘单位密度为1 ,转盘面积S 满足\max\big\{\frac{S}{w},\frac{w}{S}\big\}\leq 10^3 。
设凸多边形的重心为
其中只有
注意到出题人为了避免精度问题把值域开的很小,而根据经典结论,值域为
事实上只需要用 convex cut 切凸包两次,不仅跑得快精度还高,这样就完美地避免了各种分类讨论。这个做法实际表现是非常优秀的,在使用 double 的情况下只跑了 69ms/7000ms。
9316. Boxes
Boxes
给定三维空间中
n 个点,将其划分为若干不相交集合S_1,\dots,S_k 。要求任意两集合的凸包满足:要么体积不相交,要么其中一个包含于另一个。目标是最大化
\sum |\mathsf{conv}(S_i)| 。
若干个凸包互相嵌套最优,因此可以不断求出最外层凸包并删去。使用卷包裹法,单次时间复杂度为
还有一种能过的写法是,将点集随机打乱,然后每次跑朴素的增量法。出题人说尝试过卡掉它或者证明它,都没成功,怀疑有些深刻的道理说明是对的,但应该不简单。
7783. Military Maneuver
Military Maneuver
给出
n 个点和一个矩形区域R:[0,X]\times[0,Y] ,在R 内均匀取点,求出以该点为圆心的最小覆盖圆环的期望面积。
求出 V 图与最远点 V 图,每个 Cell 对期望的贡献可以单独算。
7734. Intersection over Union
Intersection over Union
给定一个矩形
A ,求出一个轴平行矩形B ,使得J(A,B)=\frac{|A\cap B|}{|A\cup B|} 最大。
两个矩形的中心重合最优,并且此时
5142. Grid Points
Grid Points
给定第一象限内的一个简单多边形,考虑其中所有整点
(x,y) (含边界)。按斜率y/x 从小到大排序;若相同,则按(x,y) 字典序排序。输出第k 个点。
详细版题解
5104. Guardians of the Gallery
Guardians of the Gallery
一个艺术画廊可以看成一个简单多边形,画廊中有一个保安和一个雕塑,保安和雕塑的位置都严格位于多边形内部的不同点。
雕塑可以认为是一个无限小的圆形,保安需要从当前位置出发,在多边形内部走到一个能够看到雕塑至少一半的位置。你需要求出这个最短距离。
详细版题解
保安只会走多边形顶点之间的线段(起点终点也当作顶点)。枚举两端点判断线段是否在多边形内,加入边集
能够看到雕塑的位置是多边形内的一个区域。而这个区域的边界形如雕塑位置和多边形上端点的连线。枚举这些射线,找到在多边形内的极长线段(即最长的合法可视边界)。求出每个顶点到这条线段的最短路线,判断这条路线是否在多边形内并加入
最后对
1818. Apple Orchard
Apple Orchard
给定
n 棵苹果树,每棵树会在平面上形成一个圆形阴影区域。有
q 次询问,每次给出一个与坐标轴平行的矩形,要求计算该矩形内被阴影覆盖的面积占矩形总面积的百分比。
询问相当于是求一个矩形和圆并的交。求出 Power Diagram,回答每个询问时遍历每个 Cell;将 Cell 的多边形和矩形求交,再和 Cell 管辖的圆求交,对所有 Cell 求和得到答案。
时间复杂度
5067. Two Walls
Two Walls
在二维平面上,给定起点
S 终点T 和线段AB,CD 。从S 出发,只能走直线,问不经过AB,CD 上任何的点,最少要变换几次方向才能到达T 。
注意到答案至多为
当线段
若是,则答案为
10774. Monitored Area
Monitored Area
在大小为
n 的简单多边形内放置m 个守卫,求所有守卫能够看到的面积的总和。
跟 #9037 差不多,以每个守卫为原点做极角排序,求出每个极角区间内能够照亮的三角形,最后对
6612. A Bite of Teyvat
A Bite of Teyvat
在线求出一排圆(圆心位于
y=0 上)的并的面积。
转化成 Power Diagram,等价于求
5060. Circle
Circle
给定平面上
n 个半径为r 的圆,求所有圆的交的面积,保证圆心集合是个凸包。
注意到交集一定是个凸集,所以凸包这个限制没啥用——能产生边界的只能是凸包上的点。由于半径全部相同,因此任意两个圆的交弧只能是劣弧。于是我们就可以得到一个魔改的半平面交算法:
- 维护双端队列保存交集边界的弧;
- 按照凸包顺序考虑圆,取出当前圆和队尾圆的交弧;
- 不断淘汰队尾的弧,直到两弧相交,更新队尾弧的端点;
- 淘汰队头同理,最后将当前的弧入队。
最后的面积就是多边形加上若干个弓形的面积。时间复杂度
8019. Wowoear
Wowoear
给定一条折线段路径,用另一条线段连接折线段的两点,使得新线段与折线段无交,并且节省的路径长度尽可能长。
根据机场建设的分析,新线段至少经过一个点,或者是以两折线端点为起终点的线段。
后者的求解是平凡的,对于前者可以枚举中心点
每个极角区间内,答案关于角度单峰,可以三分求解。时间复杂度
2069. Geometry PTSD
Geometry PTSD
构造单位球面上的三个点
A,B,C ,满足:\min(|AB|,|AC|,|BC|)\ge 1.7 ;原点到平面ABC 的距离在(0,\,1.5\times 10^{-19}] 内。
取
1196. Fun Region
Fun Region
给定一个简单多边形。若点
P 能通过不自交、始终顺时针转弯且不穿越多边形的折线(螺旋路径)到达所有顶点,则称P 为合法点。求所有合法点构成区域的面积。
结论是,对于每个多边形的凹角
时间复杂度
5046. Moon
Moon
单位球面上有固定点
a_1,\dots,a_n ,以及一个均匀随机点a_0 。若存在一个半球包含所有点a_0,\dots,a_n ,则f=1 ,否则f=0 。求\mathbb{E}[f] 。
特判共线/共面的情况,接着对变换前的点求三维凸包,若
否则,求答案等价于求球面凸包的面积。遍历三维凸包的每个面,若该面不包含
球面三角形的计算方式为
本题究极卡精度(见 #2069),求凸包的部分需要实现全整;求二面角的部分的最大中间量达到了 __int128 无法存下,但是可以在容忍一点精度损失的情况下转成 long double。
注意算反三角的时候需要转化成
时间复杂度
2444. Closest Pair of Segments
Closest Pair of Segments
给定
n 条线段,求出它们之间的最近距离。
二分答案
时间复杂度
2433. Panda Preserve
Panda Preserve
给定一个多边形,其每个顶点放置一个接收器,覆盖半径相同的圆形区域。求最小半径,使这些圆的并集能够覆盖整个多边形区域。
求出 V 图,最后被覆盖到的点一定在 V 图上,判断每个顶点是否在多边形内,然后更新答案即可。时间复杂度
2767. Airport Construction
Airport Construction
给定一个大小为
n 的简单多边形,求出一条在多边形内最长的线段。
可以通过平移和旋转的微扰证明:最长线段至少经过多边形的两个端点。端点
暴力的做法是把直线
精细实现可以做到
4369. Polygonal Puzzle
Polygonal Puzzle
给两个多边形,可以平移旋转(但不能对称、缩放等),求这两个多边形贴在一起但不重合的情况下贴贴部分的最大总长度。
给一个不需要动脑的做法。记两个多边形分别为
首先,如果答案不为
发现在移动的过程中会发生以下事件:
上述时刻只有
判多边形相交也可以暴力做:将
判断三角形交是简单的,比较稳妥的做法是把两个三角形的六条边的法向量当作轴,判断三角形的在该轴上的投影是否分离,存在分离则一定不相交,否则一定有交。这种判断方法的优势是在处理相交面积为
做三角剖分需要判断一条边是否完全在多边形内,一个简单的做法是先枚举
综上,我们需要枚举
每次跑
可以发现重叠的边对于答案的贡献相当于是个分段线性函数,因此我们可以动态地维护若干个线性函数和的取值,最值点一定在上面的某个时刻取到。时刻总数依然是
4111. 平凡的骰子
平凡的骰子
给定一个均质凸多面体骰子,随机抛掷后最终稳定在某一面上。以重心为球心作单位球面,每个面的着地概率等于该面在球面投影区域面积占全面积的比例。
求每个面着地的概率。
重心可以用混合积计算:将多边形拆分成若干个有向四面体,分别算出重心后加权。球面三角形的计算方式为
时间复杂度
4677. Asteroids
Asteroids
给定两个凸多边形,每个凸多边形有一个初始位置和速度,在这个速度下做匀速运动。求出两个凸多边形在运动过程中的最大重合面积,或报告不会重合。
首先算出多边形发生相交的时间段
记两个凸包在时刻
时间复杂度