Submission #1319795

#TimeUsernameProblemLanguageResultExecution timeMemory
1319795harryleeeSeesaw (JOI22_seesaw)C++20
0 / 100
0 ms332 KiB
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5;
const int inf = 1e9;
long double n, a[maxn + 1];

namespace sub1{
    long double recur(int i, int j, long double l, long double r){
        long double cur = 0;
        for (int ind = i; ind <= j; ++ind){
            cur += (long double) a[ind];
        }
        cur /= (long double) (j - i + 1);

        l = min(l, cur);
        r = max(r, cur);

        if (i == j) 
            return r - l;
        return min(recur(i + 1, j, l, r), recur(i, j - 1, l, r));
    }

    long double solve(){
        return recur(1, n, inf + 1, -1);
    }
}

namespace sub3{
    long double pre[maxn + 1];

    long double solve(){
        long double res = inf + 1;
        for (int i = 1; i <= n; ++i){
            pre[i] = pre[i - 1] + a[i];
        }
        for (int i = 1; i <= n; ++i){
            long double l = a[i], r = a[i];
            int u = i, v = i;
            
            while(u != 1 || v != n){
                if (u == 1){
                    v++;
                    r = max(r, (pre[v] - pre[u - 1]) / (long double) (v - u + 1));
                }
                else if (v == n){
                    u--;
                    l = min(l, (pre[v] - pre[u - 1]) / (long double) (v - u + 1));
                }
                else{
                    long double move_left = (pre[v] - pre[u - 2]) / (long double) (v - u + 2);
                    long double move_right = (pre[v + 1] - pre[u - 1]) / (long double) (v - u + 2);
                    if (l - move_left < move_right - r){
                        u--;
                        l = min(l, move_left);
                    }
                    else{
                        v++;
                        r = max(r, move_right);
                    }
                }
            }
            // cout << l << ' ' << r << '\n';
            res = min(res, r - l);
        }

        return res;
    }
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin >> n;
    for (int i = 1; i <= n; ++i){
        cin >> a[i];
    }

    cout << fixed << setprecision(10) << sub3::solve() << '\n';
    // if (n <= 20){
    //     cout << fixed << setprecision(9) << sub1::solve();
    // }
    // else if (n <= 2000){
    //     cout << fixed << setprecision(9) << sub3::solve();
    // }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...