Submission #1127171

#TimeUsernameProblemLanguageResultExecution timeMemory
1127171vladiliusSeesaw (JOI22_seesaw)C++20
67 / 100
529 ms48492 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<int, int>; using pdi = pair<double, int>; #define pb push_back #define ff first #define ss second struct ST{ vector<int> t; int n; ST(int ns){ n = ns; t.resize(4 * n); } void upd(int v, int tl, int tr, int& p, int& x){ if (tl == tr){ t[v] += x; return; } int tm = (tl + tr) / 2, vv = 2 * v; if (p <= tm){ upd(vv, tl, tm, p, x); } else { upd(vv + 1, tm + 1, tr, p, x); } t[v] = max(t[vv], t[vv + 1]); } void upd(int p, int x){ upd(1, 1, n, p, x); } int get(){ return t[1]; } }; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin>>n; vector<int> a(n + 1); vector<ll> p(n + 1); for (int i = 1; i <= n; i++){ cin>>a[i]; p[i] = p[i - 1] + a[i]; } if (n > 2e3) return 0; vector<vector<double>> X(n + 1, vector<double>(n + 1)); for (int i = 1; i <= n; i++){ for (int j = i; j <= n; j++){ X[i][j] = 1.0 * (p[j] - p[i - 1]) / (j - i + 1); } } priority_queue<pdi, vector<pdi>, greater<pdi>> pq; for (int i = 1; i <= n; i++) pq.push({X[1][n - i + 1], i}); vector<int> t(n + 1, 1); vector<pii> all = {{0, 0}}; int j = 1; ST T(n); double out = 1e9 + 1; while (!pq.empty()){ auto [V, i] = pq.top(); pq.pop(); int r = t[i] + n - i; if (t[i] == 1){ for (int j = 1; j <= r; j++){ T.upd(j, 1); } } else { T.upd(r, 1); } if (r < n){ pq.push({X[t[i] + 1][r + 1], i}); } all.pb({t[i]++, r}); while (T.get() == n && j < all.size()){ auto [l, r] = all[j]; if (r == n) break; int ii = n - (r - l); if (l == (t[ii] - 1)){ for (int f = t[ii] - 1; f <= t[ii] - 1 + n - ii; f++){ T.upd(f, -1); } } else { T.upd(l, -1); } if (T.get() != n){ if (l == (t[ii] - 1)){ for (int f = t[ii] - 1; f <= t[ii] - 1 + n - ii; f++){ T.upd(f, 1); } } else { T.upd(l, 1); } break; } j++; } if (T.get() == n){ auto [l, r] = all[j]; out = min(out, V - X[l][r]); } } cout<<fixed<<setprecision(12)<<out<<"\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...