分析

对每一个柱子,高度记为,需要找出它左侧(和右侧)第一个比它低的柱子的序号(分别记为),这个柱子对应的最大矩形面积为。最终答案为所有柱子中最大的矩形面积。

题解

遍历

可以用的二重循环:遍历每个柱子,对每个柱子向左右各遍历一次找出第一个比当前柱子低的柱子。会超时。

单调栈

这种“向左/向右搜索第一个比当前大的数”问题,可以使用单调栈优化复杂度至

#include<bits/stdc++.h>
#define ll long long
using namespace std;
 
int main(){
	cerr.rdbuf(nullptr);
	ios::sync_with_stdio(false);cin.tie(nullptr);
	int n;
	cin>>n;
	vector<int> h(n+2);
	h[0]=0;h[n+1]=0;
	for(int i=1;i<=n;i++)cin>>h[i];
	stack<int> st;
	ll ans=0;
	for(int i=0;i<n+2;i++){
		while(!st.empty() && h[st.top()]>h[i]){
			int mid=st.top();
			st.pop();
			// 计算mid柱子对应的最大面积
			int width=i-st.top()-1,height=h[mid];
			// st.top() 是 mid 左边第一个比 h[mid] 矮的矩形条的下标。
			// i 就是 mid 右边第一个比它矮的矩形条的下标。
			ans=max(ans,(ll)width*height);
		}
		st.push(i);
	}
	cout<<ans;
}