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
  • 相关阅读:
    [网络流24题]飞行员配对方案问题
    学习笔记——线性基
    HDU 4507 吉哥系列故事——恨7不成妻(数位DP求平方和)
    bzoj1415&洛谷P4206 [NOI2005]聪聪与可可
    后缀自动机(模板+例题)
    最小表示法(模板)poj1059
    求次小生成树(洛谷P4180&bzoj1977)
    KMP poj3942
    最小表示法(模板) CH1807
    数位dp 求山峰数(hill)
  • 原文地址:https://www.cnblogs.com/lyzuikeai/p/7417271.html
Copyright © 2011-2022 走看看