单调栈

 
```
#include <iostream>
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n;
const int N=1e5+10;
ll a[N];
ll Stack[N],width[N];
//单调栈,栈中的元素单调,递增或者递减,如果当前加入的元素不能满足原来的单调序列,以递增为例,小于它的栈中的元素都要出栈
//每一次出栈,都要更新一下res,同时需要更新下一个元素的宽度的贡献
//hdu1506
int main()
{
    while(~scanf("%d",&n)&&n){
        memset(Stack,0,sizeof(Stack));
        memset(width,0,sizeof(width));
        for(int i=0;i<n;i++)scanf("%lld",&a[i]);
        a[n]=0;
        int top=0;
        ll res=0;
        for(int i=0;i<=n;i++){
            if(a[i]>Stack[top]){
                Stack[++top]=a[i];
                width[top]=1;
            }
            else{
                int widthsum=0;
                while(Stack[top]>a[i]&&top>0){
                    widthsum+=width[top];
                    res=max(res,1LL*widthsum*Stack[top]);
                    top--;
                }
                Stack[++top]=a[i];
                width[top]=widthsum+1;
            }
        }
        printf("%lld\n",res);
    }
    return 0;
}
```


全部评论

相关推荐

09-27 14:42
已编辑
浙江大学 Java
未来未临:把浙大放大加粗就行
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务