• poj2796(单调栈)


    http://poj.org/problem?id=2796

    确定每个数边界,然后枚举

    #include<iostream>
    #include<stack>
    #include<stdio.h>
    using namespace std;
    #define ll long long
    const int maxn=1e5+10;
    int L[maxn],R[maxn],a[maxn],n,l,r;
    ll pre[maxn],ans=-1;
    stack<int>sta;
    
    int main()
    {
        scanf("%d",&n);
        a[0]=-1;
        a[n+1]=-1;
        for(int i=1;i<=n;i++) scanf("%d",&a[i]),pre[i]=pre[i-1]+a[i];
        for(int i=1;i<=n+1;i++)
        {
            if(sta.empty()||a[i]>=a[sta.top()])
                sta.push(i);
            else
            {
                while(!sta.empty()&&a[i]<a[sta.top()])
                {
                    R[sta.top()]=i-1;
                    sta.pop();
                }
                sta.push(i);
            }
        }
        sta.pop();
        for(int i=n;i>=0;i--)
        {
            if(sta.empty()||a[i]>=a[sta.top()])
                sta.push(i);
            else
            {
                while(!sta.empty()&&a[i]<a[sta.top()])
                {
                    L[sta.top()]=i+1;
                    sta.pop();
                }
                sta.push(i);
            }
        }
        for(int i=1;i<=n;i++)
        {
            if((pre[R[i]]-pre[L[i]-1])*a[i]>ans)
                ans=(pre[R[i]]-pre[L[i]-1])*a[i],l=L[i],r=R[i];
        }
        printf("%lld
    %d %d",ans,l,r);
        return 0;
    }
    
  • 相关阅读:
    1046 A^B Mod C
    1019 逆序数
    1012 最小公倍数LCM
    1011 最大公约数GCD
    序列化
    bigdecimal
    equals 和hashcode
    java多线程-读写锁原理
    Java并发编程:volatile关键字解析
    面试
  • 原文地址:https://www.cnblogs.com/eason9906/p/11754774.html
Copyright © 2020-2023  润新知