1 条题解
-
0
题目大意
给定一个村庄的轮廓折线 , 坐标递增。
要在 范围内建一座瞭望塔,塔顶必须能看到轮廓上任意位置。
求塔的最小高度(塔高 = 塔顶高度 - 塔基高度,塔基高度由轮廓在该位置的 值决定)。
问题分析
1. 可见性的几何条件
从塔顶 能看到轮廓上任意点 ,意味着线段 除了 点外,不与轮廓相交,并且整个轮廓在 的下方。
这等价于:塔顶 必须在轮廓的每条边所在直线的上方。
2. 转化为半平面交
对于轮廓的每条边 ,可以写出直线方程。
将这条边看作有向线段(从左到右),那么塔顶 必须位于该线段的左侧(即上方)。
这样,每条边对应一个半平面约束。
3. 可行区域
所有 条边对应的半平面交集是一个凸多边形区域(可能无界),表示所有可能的塔顶位置 。
由于 ,我们只考虑该凸多边形在区间 内的部分。
4. 最小化塔高
在位置 处,轮廓高度为 (由轮廓折线线性插值得到)。
塔高 = ,其中 是可行区域中的点。
目标是在可行区域中寻找 。
5. 候选点
最小值可能出现的位置:
- 半平面交多边形的顶点(在 区间内);
- 轮廓折线的顶点正上方(即 时, 取可行区域的最小可能值)。
因此,只需枚举:
- 所有半平面交的顶点;
- 所有轮廓顶点 对应的可行区域最小 (由半平面交在该 处的下边界确定)。
算法步骤
- 对轮廓的 条边,构造半平面(左侧为可行区域)。
- 用半平面交算法(如 S&I 算法)求可行凸多边形。
- 收集所有半平面交顶点,以及轮廓顶点 对应的半平面交下边界 值。
- 计算每个候选点的塔高 ,取最小值。
- 输出最小值,保留三位小数。
复杂度
- 半平面交 。
- ,足够高效。
关键点
- 将“能看到整个轮廓”转化为“塔顶在每条轮廓边的上方半平面”。
- 半平面交得到可行区域。
- 最小值出现在半平面交的顶点或轮廓顶点上方。
- 1
信息
- ID
- 3855
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者