fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. template<typename T>
  12. void maximize(T& a, const T& b) {
  13. if (a < b) a = b;
  14. }
  15.  
  16. const int N = 2e5 + 5;
  17.  
  18. int n, a, b;
  19. int x[N];
  20. ll pref[N];
  21.  
  22. int main() {
  23. ios::sync_with_stdio(false);
  24. cin.tie(nullptr);
  25. cin >> n >> a >> b;
  26. for (int i = 1; i <= n; i++) cin >> x[i];
  27.  
  28. for (int i = 1; i <= n; i++) {
  29. pref[i] = pref[i - 1] + x[i];
  30. }
  31.  
  32. // Khi xét đến đầu mút r, ta cần tìm đầu mút l thoả mãn:
  33. // a <= r - l <= b suy ra l thuộc đoạn [r - b, r - a]
  34. // và giá trị pref[r] - pref[l] lớn nhất có thể, hay nói cách khác là pref[l] phải nhỏ nhất có thể
  35. // => Với mỗi r, cần tìm pref[l] nhỏ nhất trong đoạn [r - b, r - a]
  36. // => Bài toán kinh điển tìm min trên đoạn tịnh tiến có thể giải quyết bằng deque
  37. ll ans = -LINF;
  38. deque<int> dq;
  39. for (int r = a; r <= n; r++) {
  40. while (!dq.empty() && pref[dq.back()] > pref[r - a]) dq.pop_back();
  41. dq.push_back(r - a);
  42. if (dq.front() == r - b - 1) dq.pop_front();
  43. maximize(ans, pref[r] - pref[dq.front()]);
  44. }
  45.  
  46. cout << ans << '\n';
  47. }
Success #stdin #stdout 0.01s 5288KB
stdin
8 1 2
-1 3 -2 5 3 -5 2 2
stdout
8