zoukankan      html  css  js  c++  java
  • 单调栈题目总结

    把单调栈的题目总结在一起吧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
  • 相关阅读:
    神经网络和Deep Learning
    SQL 优化tips 及误区
    特殊字符的八进制含义
    精通Web Analytics 2.0 (4) 第二章:选择你的网络分析灵魂伴侣的最佳策略
    前端学HTTP之客户端识别和cookie
    前端学HTTP之基本认证
    前端学HTTP之安全HTTP
    前端学HTTP之摘要认证
    前端学HTTP之字符集
    前端学HTTP之实体和编码
  • 原文地址:https://www.cnblogs.com/lyzuikeai/p/7417271.html
Copyright © 2011-2022 走看看