悬线法
引入
悬线法的适用范围是单调栈的子集。具体来说,悬线法可以应用于满足以下条件的题目:
- 需要在扫描序列时维护单调的信息;
- 可以使用单调栈解决;
- 不需要在单调栈上二分。
看起来悬线法可以被替代,用处不大,但是悬线法概念比单调栈简单,更适合初学 OI 的选手理解并解决最大子矩阵等问题。
例题
大意:在一条水平线上有
悬线,就是一条竖线,这条竖线有初始位置和高度两个性质,可以在其上端点不超过当前位置的矩形高度的情况下左右移动。
对于一条悬线,我们在这条上端点不超过当前位置的矩形高度且不移出边界的前提下,将这条悬线左右移动,求出其最多能向左和向右扩展到何处,此时这条悬线扫过的面积就是包含这条悬线的尽可能大的矩形。容易发现,最大子矩形必定是包含一条初始位置为
我们考虑如何快速找到悬线可以到达的最左边的位置。
过程
定义
- 如果当前
,则已经扩展到了边界,不可以。 - 如果当前
,则从当前悬线扩展到的位置不能再往左扩展了。 - 如果当前
,则从当前悬线还可以往左扩展,并且 位置的悬线能向左扩展到的位置, 位置的悬线一定也可以扩展到,于是我们将 更新为 ,并继续执行判断。
通过摊还分析,可以证明每个
实现
对于一个长度为
本题中我们可以考虑枚举最小值,将每个位置的数
最大子矩形
给定一个 'F'
和 'R'
的矩阵,求其面积最大的子矩阵的面积 'F'
。
我们会发现本题的模型和第一题的模型很像。仔细分析,发现如果我们每次只考虑某一行的所有元素,将位置
习题
贡献者:@Jimmy@kenlig@Ahacad@mgt@countercurrent_time@MingqiHuang
本页面最近更新:2/3/2023, 12:00:00 AM,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用