题目大意:给定从左到右紧挨排列的宽度均为1的矩形,他们的底边都在一条直线上,求出这个图形中最大的矩形面积
输入:(可以有很多case,输入以0结束)
矩形个数n(1<=n<=100000) 第i个矩形的高度hi(共n个,以空格隔开,0<=hi<=1000000000)
0
输出:最大矩形面积
分析:单调栈的应用。如果向左向右枚举比当前矩形高的矩形肯定会超时,所以我们考虑用单调栈,遍历一次就可以解决问题。栈中元素stack[]记录矩形在原序列中的位置。
弹栈进栈过程如下:
如果当前矩形高度大于栈顶矩形高度,则直接进栈 stack[++top] = i(i是当前矩形在原序列中的位置)
如果当前矩形高度小于栈顶矩形高度,则记录当前矩形的左界限和栈顶元素的右界限,并弹出栈顶元素(此时栈顶元素已经不能再向右扩展了,因为当前矩形高度小于它的高度,所以栈顶元素的右界限就是当前矩形在原序列中的位置-1)
代码:转载自https://www.cnblogs.com/WABoss/p/5225464.html
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 #define MAXN 111111 5 int a[MAXN]; 6 int l[MAXN],r[MAXN]; 7 int stack[MAXN],top; 8 int main(){ 9 int n; 10 while(~scanf("%d",&n) && n){ 11 for(int i=1; i<=n; ++i){ 12 scanf("%d",a+i); 13 } 14 a[++n]=-1; 15 top=0; 16 for(int i=1; i<=n; ++i){ 17 l[i]=r[i]=i; 18 while(top && a[stack[top]]>a[i]){ 19 l[i]=l[stack[top]]; 20 r[stack[top]]=i-1; 21 --top; 22 } 23 if(top && a[stack[top]]==a[i]) l[i]=l[stack[top]]; 24 stack[++top]=i; 25 } 26 long long res=0; 27 for(int i=1; i<n; ++i){ 28 res=max(res,(r[i]-l[i]+1LL)*a[i]); 29 } 30 printf("%lld\n",res); 31 } 32 return 0; 33 }