這個水題又加深了點對單調棧的認識了。不能淺嘗輒止!
這個不是special judge么?
總結:以后讀題要讀清楚,理解明白,不能有歧義啊!
#include<stdio.h>
#include<string.h>
#include<math.h>
int pos[100005],n;
long long stack[100005],sum[100005];
int main()
{
int i,s,t,top;
long long a,ans;
while (scanf("%d",&n)==1)
{
top=0;stack[0]=0;pos[0]=0;sum[0]=0;
ans=0;s=t=0;
for (i=1;i<=n ;i++ )
{
scanf("%I64d",&a);
sum[i]=sum[i-1]+a;
while (top&&a<=stack[top])
{
if (ans<(sum[i-1]-sum[pos[top-1]])*stack[top])
{
ans=(sum[i-1]-sum[pos[top-1]])*stack[top];
s=pos[top-1]+1;t=i-1;
}
top--;
}
top++;
stack[top]=a;
pos[top]=i;
}
while (top)
{
if (ans<=(sum[n]-sum[pos[top-1]])*stack[top]) //這里是<=才過的,不是special judge么?怎么回事呢,得好好看懂題目啊!
{
ans=(sum[n]-sum[pos[top-1]])*stack[top];
s=pos[top-1]+1;t=n;
}
top--;
}
printf("%I64d\n%d %d\n",ans,s,t);
}
return 0;
}
突然發現自己喜歡寫單調棧了,呵呵,這個專題好東西。
感謝sdu的奇奇神提供練習專題!!!ORZ