Advertisement
gkldiashvili

OK

Apr 20th, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.50 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define ll long long
  4. #define M 2000000000000000ll
  5.  
  6. using namespace std;
  7. const int N = 3020;
  8.  
  9. int n, d;
  10.  
  11. ll A[N][N];
  12. ll B[N][N];
  13. ll a[N], S[N];
  14. ll t, answer, sv;
  15.  
  16. int main()
  17. {
  18. scanf("%d %d %lld", &n, &d, &t); d = min(n, d);
  19. for(int i = 1; i <= n; ++ i)
  20. {
  21. scanf("%lld", &a[i]);
  22. sv += max(0ll, t - a[i]);
  23. a[i] = max(a[i], t);
  24. S[i] = S[i - 1] + a[i];
  25. }
  26. A[n][n] = 0;
  27. for(int i = n - 1; i >= 1; -- i)
  28. {
  29. for(int j = i + 1; j <= min(i + d - 1, n); ++ j)
  30. A[i][j] = A[i + 1][j] + a[j] - a[i];
  31. ll now = a[i];
  32. int cap = 0;
  33. ll tot = 0; A[i][i] = M;
  34. for(int j = i + 1; j <= n; ++ j)
  35. {
  36. int l, r;
  37. l = j; r = min(j + d - 1, n);
  38. while(l < r)
  39. {
  40. int mid = (l + r) / 2;
  41. if(a[mid] - t >= now)
  42. r = mid;
  43. else
  44. l = mid + 1;
  45. }
  46. if(l <= min(j + d - 1, n) && a[l] - t >= now)
  47. A[i][i] = min(A[i][i], tot + B[j][l]);
  48. if(cap == 0)
  49. now += t, cap = d;
  50. if(now < a[j])
  51. {
  52. now += ((a[j] - now + 1) / t + 1 ) * t;
  53. cap = d;
  54. }
  55. cap --;
  56. tot += now - a[j];
  57. }
  58. A[i][i] = min(A[i][i], tot);
  59. B[i][min(i + d - 1, n)] = A[i][min(i + d - 1, n)];
  60. for(int j = min(i + d - 1, n) - 1; j >= i; -- j)
  61. B[i][j] = min(B[i][j + 1], A[i][j]);
  62. }
  63. answer = M;
  64. for(int j = 1; j <= min(d, n); ++ j)
  65. answer = min(answer, A[1][j]);
  66. printf("%lld\n", answer + sv);
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement