제출 #1264486

#제출 시각아이디문제언어결과실행 시간메모리
1264486biankSure Bet (CEOI17_sure)C++20
100 / 100
86 ms6656 KiB
#include <bits/stdc++.h> using namespace std; #define forsn(i, s, n) for (int i = int(s); i < int(n); i++) #define forn(i, n) forsn(i, 0, n) #define dforsn(i, s, n) for (int i = int(n) - 1; i >= int(s); i--) #define dforn(i, n) dforsn(i, 0, n) #define foreach(it, c) for (auto it = begin(c); it != end(c); it++) #define sz(x) int(x.size()) #define all(x) begin(x), end(x) #define pb push_back #define eb emplace_back using vi = vector<int>; using ll = long long; using ld = long double; using vll = vector<ll>; using ii = pair<int, int>; #define fst first #define snd second const ll INF = 1e18; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; vector<ld> a(n), b(n); forn(i, n) cin >> a[i] >> b[i]; sort(all(a), greater<ld>()); sort(all(b), greater<ld>()); vector<ld> prefA(n + 1), prefB(n + 1); forn(i, n) prefA[i + 1] = prefA[i] + a[i]; forn(i, n) prefB[i + 1] = prefB[i] + b[i]; ld ret = 0.0; forsn(s, 1, 2 * n + 1) { int lo = max(0, s - n) - 1, hi = min(n, s); auto f = [&](int i) { assert(0 <= i && i <= n); assert(0 <= s - i && s - i <= n); return min(prefA[i], prefB[s - i]); }; while (hi - lo > 1) { int mid = (lo + hi) / 2; if (f(mid) < f(mid + 1)) { lo = mid; } else { hi = mid; } } ret = max(ret, f(hi) - s); } cout << fixed << setprecision(4) << ret << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...