Submission #1175065

#TimeUsernameProblemLanguageResultExecution timeMemory
1175065Math4Life2020Seesaw (JOI22_seesaw)C++20
100 / 100
96 ms19016 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long; using pii = pair<ll,ll>; using ld = long double;
using pld = pair<ld,ld>;

ll N; const ll Nm = 2e5+5; const ld INF = 1e18; const ld DEL = 1e-10;
ld avg;
ld psa[Nm+1];
ld ans = INF;

int main() {
	ios_base::sync_with_stdio(false); cin.tie(0);
    cin >> N;
    psa[0]=0.0L;
    for (ll i=0;i<N;i++) {
        ll a1; cin >> a1;
        psa[i+1]=psa[i]+a1;
    }
    avg = psa[N]/N;
    //cout << "avg="<<avg<<"\n";
    ld maxv = avg;
    set<pld> s0;
    ld imin = avg;
    s0.insert({avg,avg});
    for (ll L=1;L<N;L++) {
        ll xmin = 0; 
        ll xmax = N-L;
        while (xmin != xmax) {
            ll xt = (xmin+xmax+1)/2;
            ld avt = (psa[xt+L]-psa[xt])/L;
            if (avt >= (avg+DEL)) {
                xmax = xt-1;
            } else {
                xmin = xt;
            }
        }
        s0.insert({(psa[xmin+L]-psa[xmin])/L,(psa[xmin+1+L]-psa[xmin+1])/L});
        //cout << "pair: "<<(psa[xmin+L]-psa[xmin])/L<<","<<(psa[xmin+1+L]-psa[xmin+1])/L<<"\n";
        imin = min(imin,(psa[xmin+L]-psa[xmin])/L);
    }
    ans = min(ans,avg-imin);
    while (s0.size()>=2) {
        auto A0 = s0.begin(); pld p0 = *A0;
        s0.erase(A0);
        maxv = max(maxv,p0.second);
        ld cmin = (*(s0.begin())).first;
        //cout << "maxv,cmin="<<maxv<<","<<cmin<<"\n";
        ans = min(ans,maxv-cmin);
    }
    cout << setprecision(20);
    cout << ans << "\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...