提交时间:2024-12-05 12:46:06
运行 ID: 58202
#include<bits/stdc++.h> using namespace std; /* s[i]:以h[i]为高度的最大矩形 s[i]=(rt[i]-lt[i]-1)*h[i] rt[i]:矩形i右侧高度<h[i]的第一个矩形的下标 lt[i]:矩形i左侧... 方法:单调栈 */ const int N = 1e6 + 10; int n,lt[N],rt[N],h[N],st[N]; long long maxx; int main(){ cin>>n; for(int i=1;i<=n;i++){ scanf("%d",&h[i]); } int top=0; for(int i=1;i<=n;i++){ while(top>0 && h[st[top]]>h[i]){ //踢出左侧高于自己的 rt[st[top]]=i , top--; } lt[i]=st[top]; //接收左侧低于自己的 ++top,st[top]=i; } while(top>0){ rt[st[top]]=n+1,top--; } for(int i=1;i<=n;i++){ maxx=max(1LL*h[i]*(rt[i]-lt[i]-1),maxx); } cout<<maxx; return 0; }