题目描述
kkk做了一个人体感觉分析器。每一天,人都有一个感受值Ai,Ai越大,表示人感觉越舒适。在一段时间[i, j]内,人的舒适程度定义为[i, j]中最不舒服的那一天的感受值 * [i, j]中每一天感受值的和。现在给出kkk在连续N天中的感受值,请问,在哪一段时间,kkk感觉最舒适?
输入格式
第一行为N,代表数据记录的天数
第二行N个整数,代表每一天的感受值
输出格式
一行,表示在最舒适的一段时间中的感受值。
输入输出样例
输入 #1
6 3 1 6 4 5 2
输出 #1
60
说明/提示
样例解释:
kkk最开心的一段时间是第3天到第5天,开心值:(6+4+5)*4=60
对于30%的数据,1<=N<=100
对于70%的数据,1<=N<=2000
对于100%的数据,1<=N<=100000,1<=感受值<=1000000
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 6e5 + 10; int n; int c[maxn],que[maxn]; ll sum[maxn],dp[maxn]; int main() { scanf("%d",&n); for(register int i=1;i<=n;++i){ scanf("%d",c+i); } int tail=0; for(register int i=1;i<=n;++i){ sum[i]=sum[i-1]+c[i]; while(c[que[tail]]>=c[i]){ dp[que[tail]]+=sum[i-1]-sum[que[tail]]; tail--; } dp[i]=sum[i]-sum[que[tail]]; que[++tail]=i; } ll res=0; for(register int i=1;i<=n;++i){ res=max(res,dp[i]*c[i]); } printf("%lld ",res); return 0; }