| Time Limit: 3000MS | Memory Limit: 65536K | |
| Total Submissions: 9778 | Accepted: 2652 | |
| Case Time Limit: 1000MS | Special Judge |
Description
Input
Output
Sample Input
6 3 1 6 4 5 2
Sample Output
60 3 5
Source
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=100001;
int s[maxn],a[maxn];
long long sum[maxn];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
a[n+1]=-1;
long long ans=-1,temp;
int top=0,l,r;
for(int i=1;i<=n+1;i++)
{
while(top!=0 && a[s[top]]>a[i])
{
temp=a[s[top]]*(sum[i-1]-sum[s[top-1]]);
if(ans<temp)
{
ans=temp;
l=s[top-1]+1;
r=i-1;
}
top--;
}
top++;
s[top]=i;
}
printf("%lld\n%d %d\n",ans,l,r);
}
return 0;
}#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=100001;
struct S
{
int num,id;
}s[maxn];
struct C
{
int num,l,r;
}c[maxn];
int a[maxn];
long long sum[maxn];
int main()
{
int n,top,i,j,l,r;
long long ans=-1,temp;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
c[i].num=a[i];
sum[i]=sum[i-1]+a[i];
}
s[0].num=-1;
s[0].id=0;
top=0;
for(i=1;i<=n;i++)
{
for(j=top;j>=0;j--)
{
if(a[i]>s[j].num) break;
else
{
c[s[j].id].l=i-1;
}
}
s[j+1].num=a[i];
s[j+1].id=i;
top=j+1;
c[i].r=s[top-1].id+1;
}
for(j=0;j<=top;j++)
c[s[j].id].l=n;
for(i=1;i<=n;i++)
{
temp=(sum[c[i].l]-sum[c[i].r-1])*c[i].num;
if(ans<temp)
{
ans=temp;
l=c[i].l;
r=c[i].r;
}
}
printf("%lld\n%d %d\n",ans,r,l);
}
return 0;
}
原文地址:http://blog.csdn.net/whjkm/article/details/39211281