单调栈

 
```
#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;
}
```


全部评论

相关推荐

达芬骐:一个月入门,一年熟悉,三年精通,五年掌握,十年会用
点赞 评论 收藏
分享
野猪不是猪🐗:😇:恭喜你以出色的表现成为xxx的一员 😨:您以进入本公司人才库 实际点开:您愿望单中的xxx正在特卖!
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务