首页 > 其他 > 详细

单调栈题目总结

时间:2017-08-23 12:38:41      阅读:277      评论:0      收藏:0      [点我收藏+]

把单调栈的题目总结在一起吧QAQ——记得加上这个分组的上一篇(第一篇

bzoj 1657: [Usaco2006 Mar]Mooo 奶牛的歌声

技术分享
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int M=50007;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<0||c>9){if(c==-) f=-1; c=getchar();}
    while(c>=0&&c<=9){ans=ans*10+(c-0); c=getchar();}
    return ans*f;
}
int n,h[M],v[M];
int st[M],top,s[M],ans;
int main()
{
    n=read();
    for(int i=1;i<=n;i++) h[i]=read(),v[i]=read();
    for(int i=1;i<=n;i++){
        while(top&&h[st[top]]<h[i]) s[i]+=v[st[top--]];
        st[++top]=i;
    }
    top=0;
    for(int i=n;i;i--){
        while(top&&h[st[top]]<h[i]) s[i]+=v[st[top--]];
        st[++top]=i;
    }
    for(int i=1;i<=n;i++) ans=max(ans,s[i]);
    printf("%d\n",ans);
    return 0;
}
View Code

 bzoj 1660: [Usaco2006 Nov]Bad Hair Day 乱发节

技术分享
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define LL long long
using namespace std;
const int M=1e5+7;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<0||c>9){if(c==-) f=-1; c=getchar();}
    while(c>=0&&c<=9){ans=ans*10+(c-0); c=getchar();}
    return ans*f;
}
int h[M],n;
LL ans;
int st[M],top;
int main()
{
    n=read();
    for(int i=1;i<=n;i++) h[i]=read();
    for(int i=1;i<=n;i++){
        while(top&&h[st[top]]<=h[i]) top--;
        ans+=top; st[++top]=i;
    }printf("%lld\n",ans);
    return 0;
}
View Code

 

单调栈题目总结

原文:http://www.cnblogs.com/lyzuikeai/p/7417271.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!