备战省赛--小C的数学问题

版权声明:转载请附上原文链接哟! 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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44170305/article/details/89742548