Advertisement
edvard_davtyan

Untitled

Mar 7th, 2016
357
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.83 KB | None | 0 0
  1. struct frac {
  2.     li a, b;
  3.     frac() { }
  4.     frac(li a, li b): a(a), b(b) { }
  5.     ld value() { return ld(a) / b; }
  6. };
  7.  
  8. inline bool operator<= (const frac& a, const frac& b) { return a.a * b.b <= a.b * b.a; }
  9. inline bool operator>= (const frac& a, const frac& b) { return a.a * b.b >= a.b * b.a; }
  10. inline ostream& operator<< (ostream& out, const frac& f) { return out << f.a << "/" << f.b; }
  11.  
  12. ld calc(int *a, int n) {
  13.     static li s[N];
  14.     forn(i, n) s[i + 1] = s[i] + a[i];
  15.     auto d = [](int i, int j) { return frac(s[j + 1] - s[i], j + 1 - i); };
  16.     static int phi[N];
  17.     int p = 0, q = 0;
  18.     ld res = -1e100;
  19.     forn(i, n) {
  20.         while (p + 1 < q && d(phi[q - 2], phi[q - 1] - 1) >= d(phi[q - 2], i - 1)) q--;
  21.         phi[q++] = i;
  22.         while (p + 1 < q && d(phi[p], phi[p + 1] - 1) <= d(phi[p], i)) p++;
  23.         res = max(res, d(phi[p], i).value());
  24.     }
  25.     return res;
  26. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement