题目: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;
}