Submission #1206093

#TimeUsernameProblemLanguageResultExecution timeMemory
1206093LucasLeSeesaw (JOI22_seesaw)C++20
100 / 100
79 ms20896 KiB
#include <bits/stdc++.h>

template<typename T>
bool minimize(T &x, T y) {
    if (x > y) {
        x = y;
        return true;
    }
    return false;
}

template<typename T>
bool maximize(T &x, T y) {
    if (x < y) {
        x = y;
        return true;
    }
    return false;
}

const int MOD = 998244353;

template<typename T>
void add(T &x, T y) {
    x += y;
    if (x >= MOD) x -= MOD;
    if (x < 0) x += MOD;
}

template<typename T>
T bin_pow(T x, T y) {
    T res = 1;
    while (y) {
        if (y & 1)
            res = 1ll * res * x % MOD;
        x = 1ll * x * x % MOD;
        y >>= 1;
    }
    return res;
}

int divi(int x, int y) {
    return x * bin_pow(y, MOD - 2) % MOD;
}

#define fi first
#define se second
#define pii std::pair<int, int>
#define ld long double

const int maxn = 2e5 + 5;

int n;
int a[maxn + 5];
ld pref[maxn + 5];
int cnt[maxn + 5];
std::vector<std::pair<ld, int>> vec;

void solve() {
    std::cin >> n;
    for (int i = 1; i <= n; ++i) std::cin >> a[i];
    for (int i = 1; i <= n; ++i) {
        pref[i] = pref[i - 1] + a[i];
    }

    ld avg = pref[n] / n;
    for (int len = 1; len <= n; ++len) {
        int l = len, r = n - 1, pos = n;
        while (l <= r) {
            int mid = (l + r) >> 1;
            ld val = (pref[mid] - pref[mid - len]) / len;
            if (val < avg) {
                pos = mid;
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
        vec.push_back({(pref[pos] - pref[pos - len]) / len, len});
        if (pos < n)
            vec.push_back({(pref[pos + 1] - pref[pos - len + 1]) / len, len});
    }
    sort(vec.begin(), vec.end());

    int cur = 0;
    ld ans = -1;
    for (int i = 0, pos = 0; i < (int)vec.size(); ++i) {
        while (pos < (int)vec.size() && cur < n) {
            int vt = vec[pos].se;
            if (!cnt[vt]) cur++;
            cnt[vt]++;
            pos++;
        }
        if (cur == n) {
            ld val = vec[pos - 1].fi - vec[i].fi;
            if (ans == -1) ans = val;
            else ans = std::min(ans, vec[pos - 1].fi - vec[i].fi);
        }
        cnt[vec[i].se]--;
        if (!cnt[vec[i].se])
            cur--;
    }
    std::cout << std::fixed << std::setprecision(9) << ans << '\n';
}

int main() {
    // std::freopen("input.txt", "r", stdin);
    // std::freopen("i.inp", "r", stdin);
    // std::freopen("sushi.out", "w", stdout);

    std::ios_base::sync_with_stdio(false);
    std::cin.tie(0);

    // clock_t start = clock();

    int tc = 1;
//    std::cin >> tc;
    while (tc--)
        solve();

    // std::cerr << "Time elapsed: " << clock() - start << " ms\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...