Geometry / Numerical Methods tasks: Solution Set
List of Geometry / Numerical Methods tasks
对这篇深度好文的拙略模仿。
难度评级如下:
17325. Gemstone Dowsing
Gemstone Dowsing
\color{cornflowerblue}{\textsf{Medium}} 你走在
x 轴上,手里拿着一个宝石探测器,它的功能如下:假设当前在位置x^\prime ,它会告诉你离你当前位置最近的一个宝石是哪一个。你现在已经在
n 个位置x_1,\dots,x_n 上探测到了n 种不同的宝石,其中有k 个宝石的具体坐标是已经确定的。对于剩下的n-k 个宝石,你需要对每个宝石单独考虑:这个宝石最深的深度会是多少。
首先询问之间独立,因此对于特定的宝石我们可以忽略其他未知宝石对它的影响。原因是可以把其他未知宝石放在距离一些已知宝石无限近但是又有细微差别的位置上,使得仍然能够得到原本的探测序列。
因此,对于一个未知宝石
同时,
只用对
11641. Just Look Up
Just Look Up
\color{cornflowerblue}{\textsf{Medium}} 给出空间中的
n 个星星,人在原点的视野为一个顶角为\theta\,(0\leq \theta\leq \frac{\pi}{2}) 的圆锥。可以任意调整视野的方向,若想在视野中看不到任何一个星星,\theta 最大能是多少。
将所有的点投影到以
发现这个过程其实等价于求三维凸包,可以直接求出球面上的三维凸包,然后用每个面的外接圆更新答案即可,时间复杂度
或者也可以用朴素一点的实现:枚举两个点让圆通过这条弦,其他的点会对平面(圆其实是由平面切球得到的)的位置产生限制。找出左右限制最强的点,判断是否合法并更新答案。时间复杂度
14946. Collision Damage
Collision Damage
\color{cornflowerblue}{\textsf{Medium}} 给两个凸包
P 和Q ,记所有能让Q 通过平移与P 相交的向量集为D ,f(\boldsymbol{t}) 表示Q 通过\boldsymbol{t} 平移与P 相交的面积,求\displaystyle\frac{1}{|D|}\iint_{D} f(\boldsymbol{t}) 。
答案就是
16202. 公园
公园
\color{cornflowerblue}{\textsf{Medium}} 给定平面上
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
\color{gold}{\textsf{Medium-Hard}} 给定平面上
n 个喷头,每个喷头能覆盖一个圆形区域。要求构造一个尽可能大的圆,使得该圆内的每个点,都至少被某一个喷头覆盖。输出该满足条件的最大圆。
详细版题解
圆弧不会产生限制,因此求出圆并的顶点,再对这些顶点求出 V 图,答案的圆心一定在 V 图顶点上。对每个 V 图顶点判断是否在圆并顶点多边形内即可。
朴素实现时间复杂度
10161. Symmetric Boundary
Symmetric Boundary
\color{orangered}{\textsf{Hard}} 给出平面上的
n 个点,求出面积最小的中心对称凸包,使得n 个点都在凸包的边界上。保证任意三点不共线。
记原本的点集为
枚举点对
总共有
时间复杂度
10327. Convex Hull of Intersections
Convex Hull of Intersections
\color{cornflowerblue}{\textsf{Medium}} 给出大小为
n 的直线集合L ,求出其 Arrangement\mathcal{A}(L) 交点的凸包。
对于斜率相同的直线,只保留最外侧的两条,然后把它们当作斜率相反。然后把所有直线按照斜率排序,求出相邻两条直线的交点集合
时间复杂度
9978. Keystone Correction
Keystone Correction
\color{gold}{\textsf{Medium-Hard}} 一个投影仪被描述为一个源点的点光源和一个像矩形,投影到墙平面上。
投影可能不正,也可能不完全落在矩形荧幕上,因此可以选择像矩形里的四个角来确定一个四边形来校正画面,使得投影为一个与像矩形同宽高比且平行于地面的矩形,且完全落在荧幕上。
问校正后的画面最大面积是多少。
将像矩形投影到平面上后,会形成一个凸多边形
将三维问题转化为二维问题后,我们可以二分答案矩形的大小,然后检查该矩形能不能被塞进两个凸多边形的交集内。
先思考一个弱化版的问题:如何判断一个凸多边形
事实上,每种平移
回到原题,每次二分时求出待检查的矩形对
通过 convex cut 求半平面交优化精度,反正单次复杂度都是
9919. Concave Hull
Concave Hull
\color{cornflowerblue}{\textsf{Medium}} 给定一个大小为
n 的点集,求这个点集的凹包的总面积。凹包定义为有且仅有一个内角大于\pi 且能包含点集中所有点的简单多边形。
枚举内角大于
相邻的两个点将区间划分成一段前缀和后缀,它们与三角形上的两边分别构成两个凸包。于是凹包的面积可以表示成:凹包
预处理出该区间前后缀点集的凸包面积,在 Graham Scan(i.e., 极角排序求凸包)过程中,每加入一个点就用增量法递推出当前栈内的凸包面积。枚举相邻两个点时就能
时间复杂度
9808. Fragile Pinball
Fragile Pinball
\color{gold}{\textsf{Medium-Hard}} 给定一个有
n 条边的凸多边形,有一个沿直线运动的弹球,如果遇到边界时可以选择做反射,如果同时在两条边上可以选择做反射边界及其顺序,但是每条边只能反射一次弹球。对每个k=0,1,\cdots,n 计算弹球被反弹至多k 次时,弹球在凸多边形内可以行进的最长路程。
枚举反射的边的顺序,按照顺序将多边形做一系列对称,相当于将弹球的路径展开成一条直线。即需要求一条最长直线经过所有反射边和起始/目标多边形。
此时得到的多边形可能是自相交的,但是自交的部分一定不会对答案产生影响(直线扫不到),因此还是可以使用类似于机场建设的分析方法得到结论:弹球路径至少经过以下两个不同的点,起始多边形的顶点、目标多边形的顶点、沿途反射边的端点。
枚举直线并求出与两个多边形的交点,再判断这条直线是否经过所有反射边,时间复杂度
9037. Ancient Maps, Hidden Danger
Ancient Maps, Hidden Danger
\color{orangered}{\textsf{Hard}} 给出
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
\color{gold}{\textsf{Medium-Hard}} 给出三维空间中的
n 个点,判断能不能找到一个底面在z 平面的的圆柱体,使得n 个点都在圆柱体表面。
可以把圆柱的顶面调整到
分类讨论:
如图,
卡精度,需要全整数实现,精度要求最高的地方在于判断点
9728. Catch the Star
Catch the Star
\color{gold}{\textsf{Medium-Hard}} 给定
n 个凸形障碍M_i 和一个目标多边形S ,求出线段\overline{(l,0)\,(r,0)} 上能够完整看到S 的位置的长度。
对于每个障碍
那么
注意由于遮挡的位置是开区间,因此可能能够完整看到
10479. The Farthest Point
The Farthest Point
\color{cornflowerblue}{\textsf{Medium}}
分类讨论。
9576. Ordainer of Inexorable Judgment
Ordainer of Inexorable Judgment
\color{cornflowerblue}{\textsf{Medium}}
那维莱特。
9554. The Wheel of Fortune
The Wheel of Fortune
\color{gold}{\textsf{Medium-Hard}} 一个匀质凸多边形转盘由旋转中心划分得奖区域。当转盘的重心不在旋转中心时,转盘永远会停留在重心在最低点处,被向下的指针指向。
一个点配重
w 将会被均匀随机放在转盘上。问每个区域成为获奖区域的概率。转盘单位密度为1 ,转盘面积S 满足\max\big\{\frac{S}{w},\frac{w}{S}\big\}\leq 10^3 。
设凸多边形的重心为
其中只有
注意到出题人为了避免精度问题把值域开的很小,而根据经典结论,值域为
事实上只需要用 convex cut 切凸包两次,不仅跑得快精度还高,这样就完美地避免了各种分类讨论。这个做法实际表现是非常优秀的,在使用 double 的情况下只跑了 69ms/7000ms。
9316. Boxes
Boxes
\color{gold}{\textsf{Medium-Hard}} 给定三维空间中
n 个点,将其划分为若干不相交集合S_1,\dots,S_k 。要求任意两集合的凸包满足:要么体积不相交,要么其中一个包含于另一个。目标是最大化
\sum |\mathsf{conv}(S_i)| 。
若干个凸包互相嵌套最优,因此可以不断求出最外层凸包并删去。使用卷包裹法,单次时间复杂度为
还有一种能过的写法是,将点集随机打乱,然后每次跑朴素的增量法。出题人说尝试过卡掉它或者证明它,都没成功,怀疑有些深刻的道理说明是对的,但应该不简单。
8779. Square of Triangles
Square of Triangles
\color{orangered}{\textsf{Hard}} 给四个三角形,允许平移旋转对称。问在不重叠并且没有间隔的情况下能不能拼成一个正方形。
超级无敌巨大邪恶混乱分类讨论
7693. Convex Hull Extension
Convex Hull Extension
\color{gold}{\textsf{Medium-Hard}} 给定大小为
n 的凸包,求出平面上有多少个点能够与原本的点构成大小为n+1 的严格凸包。
考察相邻三条边
时间复杂度
7862. Land Trade
Land Trade
\color{cornflowerblue}{\textsf{Medium}} 给出逻辑表达式,有
n 个原子命题形如[a,b,c] 。当ax+by+c\geq 0 时值为真否则为假。逻辑运算符包含与、或、非、异或。你需要在矩形区域
R:=\{(x,y)\mid x_{\min}\leq x\leq x_{\max},y_{\min}\leq y\leq y_{\max}\} 中,求出能使逻辑表达式为真的区域的总面积。
通过 convex cut 求出直线集合
时间复杂度
7783. Military Maneuver
Military Maneuver
\color{gold}{\textsf{Medium-Hard}} 给出
n 个点和一个矩形区域R:[0,X]\times[0,Y] ,在R 内均匀取点,求出以该点为圆心的最小覆盖圆环的期望面积。
求出 V 图与最远点 V 图,每个 Cell 对期望的贡献可以单独算。
7734. Intersection over Union
Intersection over Union
\color{gold}{\textsf{Medium-Hard}} 给定一个矩形
A ,求出一个轴平行矩形B ,使得J(A,B)=\frac{|A\cap B|}{|A\cup B|} 最大。
两个矩形的中心重合最优,并且此时
10561. Spaceship Exploration
Spaceship Exploration
\color{cornflowerblue}{\textsf{Medium}} 平面上有一个大小为
n 的凸形障碍Q ,给定起点和终点S,T ,在只允许一次拐弯并且把不撞到Q 的情况下,S 到达T 的最短路线是什么。
求出
7568. Keychain
Keychain
\color{orangered}{\textsf{Hard}} 给出二维平面上大小为
n 的点集S ,求出一个最小的半径r ,使得能够找到一个生成圆\Gamma 经过所有以p\in S 为圆心半径为r 的圆。输出
\Gamma 圆心的精确坐标(有理数)和半径R ;允许\Gamma 退化成一条直线(R\to+\infty 的圆),此时输出直线的精确表达式ax+by=c 。
这是一个最优化问题,若指定圆心
对点集
下凸壳对应 V 图的对偶,上凸壳对应最远点 V 图的对偶,这样就可以快速求出每个 Cell 边界对应的半平面。把两个 Cell 的半平面求交就能找出交点。有一个小技巧是读入时将坐标
这题还需要处理好退化的情况:
-
- 所有点共线;
- 所有点共圆,在三维上表现即所有点共面;
-
虽然 V 图有很好的性质,但是两个 V 图的交点个数仍然会达到
5142. Grid Points
Grid Points
\color{maroon}{\textsf{Very Hard}} 给定第一象限内的一个简单多边形,考虑其中所有整点
(x,y) (含边界)。按斜率y/x 从小到大排序;若相同,则按(x,y) 字典序排序。输出第k 个点。
详细版题解
8039. Infinite Strife
Infinite Strife
\color{orangered}{\textsf{Hard}} 给出平面上
n 个点p_1,\dots ,p_n ,再给出经过每个点的m 个闭半平面以及它们的对称闭半平面(共2m 个)。对每个点选择一个半平面H_i ,求出有多少种选法使得所选半平面的并集能够覆盖目标矩形S=[-R,R]^2 。
直接做比较难,正难则反,考虑其反问题
这里的
观察到对于每个点
- 先选择
n 条无向直线,记其集合为L ; - 给
L 中的每条直线定向。
定向的方案数总共有
用平面图欧拉公式把
此处
Case 1: \mathbb{E}[L]
对于一条固定的直线,假设有
Case 2: \mathbb{E}\!\left[\sum_{q\in T}(r_q - 1)\right]
考察
SubCase 3: \mathbb{E}[r_q]
对每个关键点
因此
SubCase 4: \Pr(r_q>0)
对
若
因此我们需要分别计算每种直线和所有关键点
6813. Union of Circular Sectors
Union of Circular Sectors
\color{orangered}{\textsf{Hard}} 给出
n 个劣弧扇形,保证没有两个扇形的半径边平行,求出扇形的面积并。
#7310 的弱化版,正赛直接搬原题有点没素质了。
5104. Guardians of the Gallery
Guardians of the Gallery
\color{orangered}{\textsf{Hard}} 一个艺术画廊可以看成一个简单多边形,画廊中有一个保安和一个雕塑,保安和雕塑的位置都严格位于多边形内部的不同点。
雕塑可以认为是一个无限小的圆形,保安需要从当前位置出发,在多边形内部走到一个能够看到雕塑至少一半的位置。你需要求出这个最短距离。
详细版题解
保安只会走多边形顶点之间的线段(起点终点也当作顶点)。枚举两端点判断线段是否在多边形内,加入边集
能够看到雕塑的位置是多边形内的一个区域。而这个区域的边界形如雕塑位置和多边形上端点的连线。枚举这些射线,找到在多边形内的极长线段(即最长的合法可视边界)。求出每个顶点到这条线段的最短路线,判断这条路线是否在多边形内并加入
最后对
1818. Apple Orchard
Apple Orchard
\color{gold}{\textsf{Medium-Hard}} 给定
n 棵苹果树,每棵树会在平面上形成一个圆形阴影区域。有
q 次询问,每次给出一个与坐标轴平行的矩形,要求计算该矩形内被阴影覆盖的面积占矩形总面积的百分比。
询问相当于是求一个矩形和圆并的交。求出 Power Diagram,回答每个询问时遍历每个 Cell;将 Cell 的多边形和矩形求交,再和 Cell 管辖的圆求交,对所有 Cell 求和得到答案。
时间复杂度
5067. Two Walls
Two Walls
\color{cornflowerblue}{\textsf{Medium}} 在二维平面上,给定起点
S 终点T 和线段AB,CD 。从S 出发,只能走直线,问不经过AB,CD 上任何的点,最少要变换几次方向才能到达T 。
注意到答案至多为
当线段
若是,则答案为
9861. Mountain Is Quiet and Alone
Mountain Is Quiet and Alone
\color{cornflowerblue}{\textsf{Medium}} 有一个形如
n 个点凸包的山峰,山顶上竖着一个长度为1 的棍子,求棍子滚落过程中其中一个端点扫过的长度。
模拟棍子滚落的过程即可,需要细致讨论(i.e., 一个角卡在棍子中间,哪边是棍头)。棍子滚落的位置可以通过二分求出。时间复杂度
10774. Monitored Area
Monitored Area
\color{orangered}{\textsf{Hard}} 在大小为
n 的简单多边形内放置m 个守卫,求所有守卫能够看到的面积的总和。
跟 #9037 差不多,以每个守卫为原点做极角排序,求出每个极角区间内能够照亮的三角形,最后对
6612. A Bite of Teyvat
A Bite of Teyvat
\color{gold}{\textsf{Medium-Hard}} 在线求出一排圆(圆心位于
y=0 上)的并的面积。
转化成 Power Diagram,等价于求
6436. Paimon Polygon
Paimon Polygon
\color{gold}{\textsf{Medium-Hard}} 对于大小为
n 的点集S 和原点O=(0,0) ,求出一个划分A,B\,(A\cup B=S,A\cap B=\varnothing) ,使得A\cup O,\,B\cup O 是凸集,且他们的轮廓只在O 相交。你需要令
A\cup O,\,B\cup O 的凸包周长总和最大。
详细版题解
两凸包相互包含的情况是平凡的,只需要求两次凸包就能判断。接下来分成两种情况讨论,讨论
第一种情况:
将极角序上相邻的两个点分开,然后分别判断前半部分和后半部分的点集是否是凸集。
第二种情况:
给出大小为
n 的点集P ,有m 次询问,每次询问一个点集Q_i ,输出2\cdot|\textsf{conv}(P\cup Q)| (凸包面积的两倍)。
对于每个
求出所有形如
叉积和的查询可以通过前缀和实现,注意凸包上需要断环成链。时间复杂度
5060. Circle
Circle
\color{orangered}{\textsf{Hard}} 给定平面上
n 个半径为r 的圆,求所有圆的交的面积,保证圆心集合是个凸包。
注意到交集一定是个凸集,所以凸包这个限制没啥用——能产生边界的只能是凸包上的点。由于半径全部相同,因此任意两个圆的交弧只能是劣弧。于是我们就可以得到一个魔改的半平面交算法:
- 维护双端队列保存交集边界的弧;
- 按照凸包顺序考虑圆,取出当前圆和队尾圆的交弧;
- 不断淘汰队尾的弧,直到两弧相交,更新队尾弧的端点;
- 淘汰队头同理,最后将当前的弧入队。
最后的面积就是多边形加上若干个弓形的面积。时间复杂度
8019. Wowoear
Wowoear
\color{gold}{\textsf{Medium-Hard}} 给定一条折线段路径,用另一条线段连接折线段的两点,使得新线段与折线段无交,并且节省的路径长度尽可能长。
根据机场建设的分析,新线段至少经过一个点,或者是以两折线端点为起终点的线段。
后者的求解是平凡的,对于前者可以枚举中心点
每个极角区间内,答案关于角度单峰,可以三分求解。时间复杂度
2069. Geometry PTSD
Geometry PTSD
\color{orangered}{\textsf{Hard}} 构造单位球面上的三个点
A,B,C ,满足:\min(|AB|,|AC|,|BC|)\ge 1.7 ;原点到平面ABC 的距离在(0,\,1.5\times 10^{-19}] 内。
取
1196. Fun Region
Fun Region
\color{orangered}{\textsf{Hard}} 给定一个简单多边形。若点
P 能通过不自交、始终顺时针转弯且不穿越多边形的折线(螺旋路径)到达所有顶点,则称P 为合法点。求所有合法点构成区域的面积。
结论是,对于每个多边形的凹角
时间复杂度
5046. Moon
Moon
\color{maroon}{\textsf{Very Hard}} 单位球面上有固定点
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
\color{gold}{\textsf{Medium-Hard}} 给定
n 条线段,求出它们之间的最近距离。
二分答案
时间复杂度
2309. 保镖
保镖
\color{maroon}{\textsf{Very Hard}} 给大小为
n 的点集P 和一个矩形区域R 。在矩形区域内均匀随机选择点O ,将P 中所有点以O 为中心进行半径为1 的反演变换。记变换后点集为
P^\prime ,其严格凸包顶点数为C ,求出\mathbb{E}[C] 。
根据平面图的性质,将数凸包大小
Delaunay Triangulation 中的每个三角形都满足空圆性:三角形外接圆内没有其他点。称这种圆为内圆,反之若外接圆内包含所有点则为外圆。
对于任意一个内圆,若反演中心在该圆内,反演后该内圆会变成外圆,其他不包含该点的内圆还是内圆。反之,若在某个外圆内,反演后该点变成内圆,其他不包含该点的外圆还是外圆。
数三角剖分个数就是数内圆的个数,根据期望的线性性,每个内外圆对答案的贡献可以单独计算:都是形如一个圆与矩形
如何求内圆与外圆?将点
因此只需要求一个三维凸包,需要特殊处理一些点共竖直面的情况,由于
时间复杂度
2433. Panda Preserve
Panda Preserve
\color{gold}{\textsf{Medium-Hard}} 给定一个多边形,其每个顶点放置一个接收器,覆盖半径相同的圆形区域。求最小半径,使这些圆的并集能够覆盖整个多边形区域。
求出 V 图,最后被覆盖到的点一定在 V 图上,判断每个顶点是否在多边形内,然后更新答案即可。时间复杂度
6445. Stars in a Can
Stars in a Can
\color{gold}{\textsf{Medium-Hard}} 给出空间中的
n 个星星,求出一个最小的圆柱体能包住这n 个星星,并且其中一个底面上至少有三个星星。
求出三维凸包,枚举每一个面作为底面然后将所有点投影到这个底面上跑最小圆覆盖即可。时间复杂度
2767. Airport Construction
Airport Construction
\color{gold}{\textsf{Medium-Hard}} 给定一个大小为
n 的简单多边形,求出一条在多边形内最长的线段。
可以通过平移和旋转的微扰证明:最长线段至少经过多边形的两个端点。端点
暴力的做法是把直线
精细实现可以做到
11817. Resonators
Resonators
\color{gold}{\textsf{Medium-Hard}} 给出平面上
n 个圆C_i ,记这些圆的并集区域为\Omega:= \bigcup_{i=1}^{n} C_i ,求\displaystyle\iint_{\Omega}(x^2+y^2)\,dxdy 。
套用格林公式
将圆弧参数化,单段圆弧贡献为
其原函数可用
所以答案就是各段求和
朴素时间复杂度
182. Cover the Polygon with Your Disk
Cover the Polygon with Your Disk
\color{cornflowerblue}{\textsf{Medium}} 求出一个圆
C 通过平移与凸包P 的最大交集面积。
记
对于三分中遇到
时间复杂度
7350. Test For An Intern
Test For An Intern
\color{gold}{\textsf{Medium-Hard}} 求出一个凸包
Q 通过平移与凸包P 的最大交集面积。
和上一题类似通过三分套三分求解,但是本题无法通过简单的修正来保证单峰性。本题的闵可夫斯基差
时间复杂度
7310. Circular Sectors
Circular Sectors
\color{maroon}{\textsf{Very Hard}} 给出
n 个无特殊限制的扇形(i.e., 圆心可以不同、弧可以是优弧、边界可以重合),求出它们并集的面积。
这是一道偏重实现的题,思路很简单,只需要找到最终图形的边界然后用格林公式算一遍积分即可。
具体地说,先把图形做梯形/类梯形分解:
- 对于半径边,把它分解为一个与
x 轴围成的梯形,判断它的下方是否在图形内然后确定梯形面积的正负; - 对于圆弧边,先把它过圆心水平切一刀,变成若干段沿着
x 轴单调的弧,然后判断每段弧分解成一个类梯形,同样需要判断面积的正负。
现在我们得到了至多
线段
圆弧
其中
问题变成计算边界裸露的位置,对每条边界讨论其他所有边界对它造成的遮挡,大概要分下面四种类型:
- 线段 to 线段
- 线段 to 圆弧
- 圆弧 to 线段
- 圆弧 to 圆弧
对于任意两段边界
-
- $p$ 和 $q$ 是同一个方向,该区间由编号较小的边界贡献; - $p$ 和 $q$ 不是同一个方向,可以直接 ban 掉; -
最后,对
时间复杂度
4369. Polygonal Puzzle
Polygonal Puzzle
\color{maroon}{\textsf{Very Hard}} 给两个多边形,可以平移旋转(但不能对称、缩放等),求这两个多边形贴在一起但不重合的情况下贴贴部分的最大总长度。
给一个不需要动脑的做法。记两个多边形分别为
首先,如果答案不为
发现在移动的过程中会发生以下事件:
上述时刻只有
判多边形相交也可以暴力做:将
判断三角形交是简单的,比较稳妥的做法是把两个三角形的六条边的法向量当作轴,判断三角形的在该轴上的投影是否分离,存在分离则一定不相交,否则一定有交。这种判断方法的优势是在处理相交面积为
做三角剖分需要判断一条边是否完全在多边形内,一个简单的做法是先枚举
综上,我们需要枚举
每次跑
可以发现重叠的边对于答案的贡献相当于是个分段线性函数,因此我们可以动态地维护若干个线性函数和的取值,最值点一定在上面的某个时刻取到。时刻总数依然是
4111. 平凡的骰子
平凡的骰子
\color{gold}{\textsf{Medium-Hard}} 给定一个均质凸多面体骰子,随机抛掷后最终稳定在某一面上。以重心为球心作单位球面,每个面的着地概率等于该面在球面投影区域面积占全面积的比例。
求每个面着地的概率。
重心可以用混合积计算:将多边形拆分成若干个有向四面体,分别算出重心后加权。球面三角形的计算方式为
时间复杂度
4677. Asteroids
Asteroids
\color{gold}{\textsf{Medium-Hard}} 给定两个凸多边形,每个凸多边形有一个初始位置和速度,在这个速度下做匀速运动。求出两个凸多边形在运动过程中的最大重合面积,或报告不会重合。
首先算出多边形发生相交的时间段
记两个凸包在时刻
时间复杂度
11248. Convex Polyhedron
Convex Polyhedron
\color{gold}{\textsf{Medium-Hard}} 给定一个三维凸包,求一个平面使得三维凸包在这个平面上的投影面积最大。
首先枚举所有的可视面组合:枚举
接下来求出这些面能在同一个平面上投影出的最大面积:将所有面的单位法向量
时间复杂度