제출 #1154980

#제출 시각아이디문제언어결과실행 시간메모리
1154980_8_8_Seesaw (JOI22_seesaw)C++20
100 / 100
86 ms13072 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

#define double long double
#define int ll
const int N = (int)1e6 + 10, MOD = (int)1e9 + 7, inf = (int)2e9;

int n, a[N], p[N];

double s[N];
double get(int l, int r) {
    return (1.0 * (p[r] - p[l - 1])) / (1.0 * (r - l + 1)) ;
}
array<double, 2> c[N];
void test() {
    cin >> n;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        p[i] = p[i - 1] + a[i];
    }
    double f = get(1, n);
    for(int i = 1; i < n; i++) {
        int l = 1, r = n - i + 1;
        while(r - l > 1) {
            int mid = (l + r) >> 1;
            if(get(mid, mid + i - 1) > f) {
                r = mid;
            } else {
                l = mid;
            }
        }
        // cout << i << ' ' << l << ' ' << r << '\n';
        c[i] = {get(r, r + i - 1), get(l, l + i - 1)};
    }
    sort(c + 1, c + n);
    for(int i = 1; i < n; i++) swap(c[i][0], c[i][1]);
    s[n] = inf;
    for(int i = n - 1; i >= 1; i--) {
        s[i] = min(s[i + 1], c[i][0]);
    }
    for(int i = 1; i < n; i++) {
        // cout << c[i][0] << ' ' << c[i][1] << '\n';
    }
    double res = inf;
    for(int i = 0; i < n; i++) {
        double val = (i == n - 1 ? f : s[i + 1]);
        res = min(res, max(f, c[i][1]) - val);
        // cout << i << ' ' << max(f, c[i][1]) - val << ' ' << val << '\n';
    }
    cout << fixed << setprecision(10) << res << '\n';
}

int32_t main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int t = 1;
    // cin >> t;

    while(t--) {
        test();
    }
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...