版权声明:转载请附上原文链接哟! https://blog.csdn.net/weixin_44170305/article/details/89742548
如花美眷,似水流年,回得了过去,回不了当初。
题目描述
小C是个云南中医学院的大一新生,在某个星期二,他的高数老师扔给了他一个问题。
让他在1天的时间内给出答案。
但是小C不会这问题,现在他来请教你。
请你帮他解决这个问题。
有n个数,每个数有权值。
数学老师定义了区间价值为区间和乘上区间内的最小值。
现在要你找出有最大区间价值的区间是什么,并输出区间价值。
输入
每个输入文件只包含单组数据。
第一行一个整数n。(1 <= n <= 100000)
第二行n个整数a_1,a_2,...,a_n。(0 <= a_i <= 1000000)
输出
第一行输出一个整数,表示最大的区间价值。
第二行输出两个整数,表示区间的起点和终点。
保证答案唯一。
样例输入
复制样例数据
6 10 1 9 4 5 9
样例输出
108 3 6
#include<iostream>
#include<cstdio>
#include<algorithm>
int a[100005],z[100005],y[100005];
long long sum[100005];
using namespace std;
int main()
{
int n,i,j;
long long ma=-1;
int qj1=0,qj2=0;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a[i];
sum[i]=sum[i-1]+a[i];
}
for(i=1;i<=n;i++)
{
j=i;
while(j>1&&a[j-1]>=a[i])
j=z[j-1];
z[i]=j;
}
for(i=n;i>=1;i--)
{
j=i;
while(j<n&&a[j+1]>=a[i])
j=y[j+1];
y[i]=j;
}
long long t;
for(i=1;i<=n;i++)
{
t=a[i]*(sum[y[i]]-sum[z[i]-1]);
if(t>ma)
{
ma=t;
qj1=z[i];
qj2=y[i];
}
}
cout<<ma<<endl;
cout<<qj1<<' '<<qj2<<endl;
return 0;
}