제출 #1127020

#제출 시각아이디문제언어결과실행 시간메모리
1127020VinhLuuSeesaw (JOI22_seesaw)C++20
100 / 100
366 ms27300 KiB
#include <bits/stdc++.h> //#define ll long long const int N = 1e6 + 5; #define ll long double using namespace std; int n; ll a[N]; //namespace sub1 { // void solve() { // cin >> n; // for(int i = 1; i <= n; i ++) cin >> a[i]; // double ans = (double)(2e9); // for(int msk = 0; msk < (1 << n); msk ++) { // double sum = 0; // int l = 1, r = n; // for(int i = 1; i <= n; i ++) sum += a[i]; // double cnt = n; // double mi = (1.0 * sum) / (1.0 * cnt); // double mx = (1.0 * sum) / (1.0 * cnt); // // for(int k = 1; k < n; k ++) if(msk >> (k - 1) & 1) { // sum -= a[r]; // cnt--; // mx = max(mx, (1.0 * sum) / (1.0 * cnt)); // mi = min(mi, (1.0 * sum) / (1.0 * cnt)); // r --; // } else { // sum -= a[l]; // cnt--; // mx = max(mx, (1.0 * sum) / (1.0 * cnt)); // mi = min(mi, (1.0 * sum) / (1.0 * cnt)); // l ++; // } // ans = min(ans, mx - mi); // } // cout << setprecision(9) << fixed << ans; // } //} namespace AC { ll s[N]; int L[N], R[N]; ll cal(int l,int r) { return (ll)(s[r] - s[l - 1]) / (ll)(r - l + 1); } void solve() { ll sum = 0; for(int i = 1; i <= n; i ++) sum += a[i], s[i] = s[i - 1] + a[i]; ll med = sum / n; multiset<ll> save; save.insert(med); int l[2], r[2]; l[0] = 1, r[0] = n, l[1] = 1, r[1] = n; priority_queue<pair<ll,ll>, vector<pair<ll,ll>>, greater<pair<ll,ll>>> pq; for(int i = n - 1; i >= 1; i --) { set<pair<ll,ll>> tmp; tmp.insert({l[0] + 1, r[0]}); tmp.insert({l[0], r[0] - 1}); tmp.insert({l[1], r[1] - 1}); tmp.insert({l[1] + 1, r[1]}); int nl[2], nr[2]; ll _left = (ll)2e9, _right = (ll)2e9; nl[0] = nl[1] = nr[0] = nr[1] = 0; for(auto [x, y] : tmp) { int val = cal(x, y); if(val <= med && med - val < _left) { _left = med - val; nl[0] = x, nr[0] = y; } if(val > med && val - med < _right) { _right = val - med; nl[1] = x, nr[1] = y; } } save.insert(cal(nl[0], nr[0])); if(nl[1] != nl[0] || nr[1] != nr[0]) { L[i] = nl[1], R[i] = nr[1]; pq.push({cal(nl[0], nr[0]), i}); } l[0] = nl[0], r[0] = nr[0], l[1] = nl[1], r[1] = nr[1]; } ll ans = (ll)(2e9); ans = min(ans, (*save.rbegin()) - (*save.begin())); while(!pq.empty()) { ll w; int id; tie(w, id) = pq.top(); pq.pop(); auto ptr = save.find(w); save.erase(w); save.insert(cal(L[id], R[id])); ans = min(ans, (*save.rbegin()) - (*save.begin())); } cout << setprecision(9) << fixed << ans; } } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define task "seesaw" if(fopen(task ".inp","r")) { freopen(task ".inp","r",stdin); freopen(task ".out","w",stdout); } cin >> n; for(int i = 1; i <= n; i ++) cin >> a[i]; AC :: solve(); }

컴파일 시 표준 에러 (stderr) 메시지

seesaw.cpp: In function 'int main()':
seesaw.cpp:113:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  113 |     freopen(task ".inp","r",stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
seesaw.cpp:114:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  114 |     freopen(task ".out","w",stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...