Feel Good POJ

来源:互联网 发布:excel如何导入外部数据 编辑:程序博客网 时间:2024/04/30 14:17

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

题意:给一个序列,定义一段序列的T值为这段序列元素和成最小元素大小

单调栈裸题,。。。有答案等于0的情况,,,,,因为写法ans记录结果初值赋了0,比较时判断当大于0才改变记录的结果值,这明显是会错的。。。。。wa了半天没看出来。。。

#include<algorithm>#include<stdio.h>#include<iostream>using namespace std;long long a[100005];long long sum[100005];struct node{    int index,c,l,r;}ack[100005];int main(){    int n,i,l,r;    cin>>n;    for(i=0;i<n;i++)    {        scanf("%lld",&a[i]);    }    int top=0;    sum[0]=a[0];    for(i=1;i<n;i++)        sum[i]=sum[i-1]+a[i];    long long ans=0;    for(i=0;i<n;i++)    {        node temp;        temp.c=a[i];        temp.index=i;        temp.l=i;        temp.r=i;        while(top>0&&ack[top-1].c>=a[i])        {            top--;            if(top)            ack[top-1].r=ack[top].r;            temp.l=ack[top].l;        //    cout<<ack[top].index<<" "<<ack[top].l<<" "<<ack[top].r<<endl;            if(ack[top].c*(sum[ack[top].r]-(ack[top].l?sum[ack[top].l-1]:0))>=ans)            ans=ack[top].c*(sum[ack[top].r]-(ack[top].l?sum[ack[top].l-1]:0)),l=ack[top].l,r=ack[top].r;        }        ack[top++]=temp;    }    while(top)    {        top--;        if(top)            ack[top-1].r=ack[top].r;        if(ack[top].c*(sum[ack[top].r]-(ack[top].l?sum[ack[top].l-1]:0))>=ans)        ans=ack[top].c*(sum[ack[top].r]-(ack[top].l?sum[ack[top].l-1]:0)),l=ack[top].l,r=ack[top].r;    }    cout<<ans<<endl<<l+1<<" "<<r+1<<endl;    return 0;}


原创粉丝点击