最近,afy决定给TOJ印刷广告,广告牌是刷在城市的建筑物上的,城市里有紧靠着的N个建筑。afy决定在上面找一块尽可能大的矩形放置广告牌。我们假设每个建筑物都有一个高度,从左到右给出每个建筑物的高度H1,H2…HN,且 \(1\leq Hi\leq1,000,000,000\) ,并且我们假设每个建筑物的宽度均为1。要求输出广告牌的最大面积。
对于这道题,一开始我有个贪心思路,不过好像假了
错误思路: 维护一个当前最大面积的区间,
每次向右插入一个点,如果左端点的贡献为负数,就将左端点删去,
错误:左端点对当前区间的贡献为负数,不一定对之后区间贡献为负数
卡掉错误做法样例:
5
13 34 16 25 30
首先\(a[2] > 2*a[1]\),将13弹出
但是 \(13\) 对区间 \([2,4]\) 有 \(13-4*(16-13) = 1\)的贡献,而错误做法中,弹出后就不会补上,所以错误
正确做法:对每个建筑物维护一个区间:以以该建筑物为最小值的最大区间,不难发现这个这个区间就是一个建筑物的最大面积贡献
这个东西可以单调队列 \(O(n)\) 维护