中石油 备战省赛1 小C的数学问题

题目链接

全场最精华部分 为1到2;
优化时间了很多很多;

#include<stdio.h>
int main()
{
    int n;
    long long int a[123000],s[123000],l[123000],r[123000];
    s[0]=0;
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        s[i]=s[i-1]+a[i];
    }
    int j;
    for(int i=1;i<=n;i++)                                     //1
    {
        j=i;
        while(j>1&&a[j-1]>=a[i])
        {
            j=l[j-1];
        }
        l[i]=j;
    }                                                                //2
    for(int i=n;i>=1;i--)
    {
        j=i;
        while(j<n&&a[j+1]>=a[i])
        {
            j=r[j+1];
        }
        r[i]=j;
    }
    long long int ans=-1,L,R;
    for(int i=1;i<=n;i++)
    {
        long long int v=a[i]*(s[r[i]]-s[l[i]-1]);// printf("i:%d  %d %d %d\n",i,v,l[i],r[i]);
        if(v>ans)
        {
            ans=v;
            L=l[i];
            R=r[i];
        }
    }

    printf("%lld\n%lld %lld\n",ans,L,R);
    return 0;
}

发布了18 篇原创文章 · 获赞 7 · 访问量 995

猜你喜欢

转载自blog.csdn.net/qq_43559193/article/details/89102344
今日推荐