1 条题解
-
0
问题分析
我们有 个块,每个块宽 ,高 ,长 。
我们要找一个长方体,底面是连续的若干个块(宽度 ),高度不能超过这些块的最小 ,长度不能超过这些块的最小 。体积公式为:
其中 。
思路
1. 二维直方图最大矩形类比
在二维直方图最大矩形问题中,我们通常用单调栈来枚举每个高度作为最小值的区间,然后计算面积。
这里变成了两个维度 同时限制,不能直接分开处理。
2. 分治思路
一个经典做法是使用分治:
- 在区间 中,取中点 。
- 最大长方体要么完全在左半 ,要么完全在右半 ,要么跨越中点。
- 递归解决左右两半。
- 重点处理跨越中点的情况。
3. 跨越中点的处理
假设我们固定一个区间 跨越 ,那么:
我们可以从中点向左右扩展,记录扩展过程中 和 的最小值。
具体方法
-
从中点 向左扩展 到 ,记录:
- 其中 从 到 。
-
从中点 向右扩展 到 ,记录:
-
枚举左端点 从 到 ,对于每个 ,我们希望在右半部分找到 使得:
$$(M-l+1 + r-M) \times \min(minA_L[l], minA_R[r]) \times \min(minB_L[l], minB_R[r]) $$最大。
4. 优化枚举
直接枚举 是 的,不可行。
注意:当 固定时,随着 增加, 可能减小或不变, 也可能减小或不变。
我们可以把右半部分按照 的变化分成若干段(单调栈思想),每段内 相同,并且 是单调的(因为 也是单调递减的)。
这样,对于每个 ,我们只需要在右半部分的这些段中找最优解。
5. 双指针/凸壳思想
实际上,这是一个二维优化问题:
$$\text{最大化 } (lenL + lenR) \times \min(A_l, A_r) \times \min(B_l, B_r) $$其中 , 。
我们可以将右半部分按 排序(从大到小),然后维护一个类似凸壳的结构,因为当 时,体积为:
当 时,体积为:
两种情况都可以用双指针或单调栈优化。
6. 实现细节
- 分治递归深度 。
- 每一层处理 或 。
- 最终复杂度 或 ,取决于实现。
- 1
信息
- ID
- 4738
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者