poj 2796

来源:互联网 发布:外立面效果图制作软件 编辑:程序博客网 时间:2024/06/05 06:28

单调栈经典题目

#include <cstdio>#include <string>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>using namespace std;typedef long long ll;const int maxn=1e5+10;int le[maxn],stack[maxn],top,l,r,n,a[maxn];ll sum[maxn],t,ans;int main(){    while(scanf("%d",&n)!=EOF){            ans=-1;    memset(sum,0,sizeof(sum));    top=0;    for(int i=1;i<=n;i++)    {        scanf("%d",&a[i]);        sum[i]=sum[i-1]+a[i];    }    a[++n]=-1;    for(int i=1;i<=n;i++)    {        if(top==0||a[i]>a[stack[top-1]])        {            le[i]=i;            stack[top++]=i;            continue;        }        if(a[i]==a[stack[top-1]])            continue;        while(top>=1&&a[i]<a[stack[top-1]])        {            top--;            t=1LL*a[stack[top]]*(sum[i-1]-sum[le[stack[top]]-1]);            if(t>ans)            {                ans=t;                l=le[stack[top]];                r=i-1;            }        }        le[i]=le[stack[top]];        stack[top++]=i;    }    printf("%lld\n%d %d\n",ans,l,r);    }    return 0;}


0 0
原创粉丝点击