P2422
题目
题目描述:
kkk 做了一个人体感觉分析器。每一天,人都有一个感受值 Ai,Ai 越大,表示人感觉越舒适。在一段时间 [i,j] 内,人的舒适程度定义为 [i,j] 中最不舒服的那一天的感受值 × [i,j]中每一天感受值的和。现在给出 kkk 在连续 N 天中的感受值,请问,在哪一段时间,kkk 感觉最舒适?
输入格式:
第一行为 N,代表数据记录的天数。
第二行 N 个整数,代表每一天的感受值。
输出格式:
一行,表示在最舒适的一段时间中的感受值。
数据范围与说明:
kkk 最开心的一段时间是第 3 天到第 5 天,开心值:(6+4+5)×4=60。
对于 30% 的数据,1≤N≤100。
对于 70% 的数据,1≤N≤2000。
对于 100% 的数据,1≤N≤105,1≤感受值≤106。
输入输出样例 #1
输入:
输出:
代码
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; }
|