Submission #15267

#TimeUsernameProblemLanguageResultExecution timeMemory
15267hodduc달리는 게임 (kriii3_E)C++98
70 / 70
173 ms44052 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...