This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<stdio.h>
int N;
long long s[1000001], v[1000001], ss[1000001];
long long bound[1000001];
long long d[1000001];
int stack[1000001], top;
int main()
{
scanf("%d", &N);
for(int i=1; i<=N; i++) scanf("%lld", &v[i]);
for(int i=1; i<=N; i++) s[i]=s[i-1]+v[i];
for(int i=1; i<=N; i++){
ss[i] = ss[i-1] + v[i]*i;
}
for(int i=1; i<=N; i++){
while(top && s[stack[top]] <= s[i]){
top--;
}
if(top) {
bound[i] = stack[top] + 1;
} else {
bound[i] = 0;
}
stack[++top] = i;
}
for(int i=1; i<=N; i++)
{
d[i] = d[i-1];
if (v[i] < 0) continue;
int lb = bound[i];
// printf("%lld %lld", s[i], s[lb-1]);
// printf(" %d ", lb);
long long tmp = ss[i] - ss[lb];
tmp -= (s[i] - s[lb]) * (lb);
tmp += d[lb];
//printf("%d %lld %d %lld\n", i, tmp, lb, d[lb]);
if (tmp > d[i]) d[i] = tmp;
}
printf("%lld\n", d[N]);
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |