fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int N = 1000000 + 10;
  6. const long long inf = 1e9 * 1e9;
  7.  
  8. int a[N], sum[N];
  9. long long f[N];
  10. int Q[N];
  11. int n, m, tail;
  12.  
  13. int x(int i) {
  14. return i;
  15. }
  16.  
  17. long long y(int i) {
  18. return f[i] + 1LL * sum[i] * (i + 1);
  19. }
  20.  
  21. int k(int i) {
  22. return sum[i];
  23. }
  24.  
  25. int main() {
  26. cin >> n >> m;
  27. for (int i=1; i<=n; i++) {
  28. cin >> a[i];
  29. sum[i] = sum[i-1] + a[i];
  30. }
  31. Q[tail++] = 0;
  32. for (int i=1; i<=n; i++) {
  33. int j, left = 0, right = tail - 1, mid;
  34. while (left <= right) {
  35. mid = (left + right) / 2;
  36. if (mid == tail - 1 || (y(Q[mid+1]) - y(Q[mid])) > 1LL * k(i) * (x(Q[mid+1]) - x(Q[mid]))) {
  37. j = Q[mid];
  38. right = mid - 1;
  39. }
  40. else left = mid + 1;
  41. }
  42. f[i] = f[j] - 1LL * (sum[i] - sum[j]) * (j + 1) + m;
  43. while (tail >= 2 && (y(i) - y(Q[tail-1])) * (x(Q[tail-1]) - x(Q[tail-2])) <= (y(Q[tail-1]) - y(Q[tail-2])) * (x(i) - x(Q[tail-1]))) tail --;
  44. Q[tail++] = i;
  45. }
  46. cout << -f[n] << endl;
  47. return 0;
  48. }
Success #stdin #stdout 0.01s 5276KB
stdin
Standard input is empty
stdout
0