P2422

题目

题目描述:

kkk 做了一个人体感觉分析器。每一天,人都有一个感受值 AiA_iAiA_i 越大,表示人感觉越舒适。在一段时间 [i,j]\left[i, j\right] 内,人的舒适程度定义为 [i,j]\left[i, j\right] 中最不舒服的那一天的感受值 ×\times [i,j]\left[i, j\right]中每一天感受值的和。现在给出 kkk 在连续 NN 天中的感受值,请问,在哪一段时间,kkk 感觉最舒适?

输入格式:

第一行为 NN,代表数据记录的天数。

第二行 NN 个整数,代表每一天的感受值。

输出格式:

一行,表示在最舒适的一段时间中的感受值。

数据范围与说明:

kkk 最开心的一段时间是第 33 天到第 55 天,开心值:(6+4+5)×4=60(6+4+5)\times4=60

对于 30%30\% 的数据,1N1001\le N\le 100

对于 70%70\% 的数据,1N20001\le N\le 2000

对于 100%100\% 的数据,1N1051\le N\le 10^51感受值1061\le \texttt{感受值}\le 10^6

输入输出样例 #1

输入:

1
2
6
3 1 6 4 5 2

输出:

1
60

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<bits/stdc++.h>
using namespace std;
long long a[100006],s[100006],f[100006],q[100006],ans=0,tail;
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
n++;
a[n]=0;
for(register int i=1;i<=n;i++){
s[i]=s[i-1]+a[i];
}
for(register int i=1;i<=n;i++){
while(a[q[tail]]>a[i]){
f[q[tail]]+=(s[i-1]-s[q[tail]]);
tail--;
}
f[i]=s[i]-s[q[tail]];
q[++tail]=i;
}
for(register int i=1;i<=n-1;i++){
ans=max(ans,f[i]*a[i]);
}
printf("%lld",ans);
return 0;
}