单调栈

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


全部评论

相关推荐

点赞 评论 收藏
分享
05-07 19:10
已编辑
中国科学技术大学 C++
silly01:现在先去 momenta,8-9月去鹅找日常实习,八股文算法背好了你这随便进。不过建议补充一下后端知识,MySQL、Redis看下八股,再补个6824,加点go后台的技术栈,9月随便进大厂。CPP后端只能来WXG
点赞 评论 收藏
分享
头顶尖尖的程序员:我也是面了三四次才放平心态的。准备好自我介绍,不一定要背熟,可以记事本写下来读。全程控制语速,所有问题都先思考几秒,不要急着答,不要打断面试官说话。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-25 20:45
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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