• 单调栈题目总结


    把单调栈的题目总结在一起吧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
    ",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
    ",ans);
        return 0;
    }
    View Code

     bzoj 1345: [Baltic2007]序列问题Sequence

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #define LL long long
    using namespace std;
    const int M=1e5+7,inf=0x7f7f7f7f;
    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,st[M],top;
    LL ans,k;
    int main()
    {
        n=read(); st[0]=inf;
        for(int i=1;i<=n;i++){
            k=read();
            while(top&&st[top]<=k){
                if(k<st[top-1]) ans+=k;
                else ans+=st[top-1];
                top--;
            }
            st[++top]=k;
        }
        while(top>1) ans+=st[--top];
        printf("%lld
    ",ans); 
        return 0;
    }
    View Code
  • 相关阅读:
    Dapper缓冲的真正含义
    css字体变瘦,窄
    打印request的信息
    部分浏览器cookie无法传输cookie,谷歌51-66版本
    Vue点击div以外的地方使div消失
    MybatisPlus模糊查询(like),查询不到中文,却可以查询到英文和数字的一种解决办法
    看起来很唬人,然而却简单实用的CAP理论
    做业务系统研发如何做到认真负责?
    聊聊关于创业公司招聘技术负责人
    [系列] Go
  • 原文地址:https://www.cnblogs.com/lyzuikeai/p/7417271.html
Copyright © 2020-2023  润新知