Advertisement
Ritam_C

Maximum average segment

Dec 21st, 2021
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.21 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int n, d; vector<double> a;
  5.  
  6. struct Node {
  7.     int left, right; bool f;
  8. };
  9.  
  10. Node good(double m) {
  11.     vector<double> prefSums(n+1);
  12.     vector<pair<double, int>> minSums(n+1);
  13.     prefSums[0] = minSums[0].first = -m;
  14.     minSums[0].second = 0;
  15.     for(int i = 1; i <= n; i++) {
  16.         prefSums[i] = prefSums[i-1]+a[i-1]-m;
  17.         if(minSums[i-1].first > prefSums[i]) {
  18.             minSums[i] = {prefSums[i], i};
  19.         } else {
  20.             minSums[i] = minSums[i-1];
  21.         }
  22.     }
  23.     int e = d;
  24.     while(e <= n) {
  25.         if(prefSums[e] >= minSums[e-d].first) {
  26.             return {minSums[e-d].second+1, e, true};
  27.         }
  28.         e++;
  29.     }
  30.     return {-1, -1, false};
  31. }
  32.  
  33. int main() {
  34.     ios_base::sync_with_stdio(false);
  35.     cin.tie(NULL); cout.tie(NULL);
  36.     cin >> n >> d;
  37.     a.resize(n); for(double& i : a) cin >> i;
  38.     double l = 1, r = 1e7+9;
  39.     Node ans;
  40.     for(int i = 0; i < 100; i++) {
  41.         double m = l+(r-l)/2;
  42.         Node p = good(m);
  43.         if(p.f) {
  44.             ans = p;
  45.             l = m+1;
  46.         } else {
  47.             r = m-1;
  48.         }
  49.     }
  50.     cout << ans.left << " " << ans.right;
  51.     return 0;
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement