제출 #523818

#제출 시각아이디문제언어결과실행 시간메모리
523818valerikkGap (APIO16_gap)C++17
100 / 100
66 ms4184 KiB
#include "gap.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const ll INF = (ll)1e18; ll MN, MX; pair<ll, ll> get(ll l, ll r) { MinMax(l, r, &MN, &MX); return {MN, MX}; } ll findGap(int t, int n) { if (t == 1) { vector<ll> lft, rght; ll l = 0, r = INF; for (int i = 0; i < (n + 1) / 2; ++i) { auto [L, R] = get(l, r); lft.push_back(L); if (L != R) rght.push_back(R); l = L + 1; r = R - 1; } while (!rght.empty()) { lft.push_back(rght.back()); rght.pop_back(); } ll res = 0; for (int i = 1; i < (int)lft.size(); ++i) { //assert(lft[i - 1] < lft[i]); res = max(res, lft[i] - lft[i - 1]); } return res; } if (t == 2) { auto [l, r] = get(0, INF); ll d = (r - l + n - 2) / (n - 1); ll res = d; vector<pair<ll, ll>> segs; ll cur = l; while (cur <= r) { segs.push_back({cur, min(r, cur + d)}); cur = cur + d + 1; } vector<ll> mx(segs.size()), mn(segs.size()); for (int i = 0; i < (int)segs.size(); ++i) { auto [L, R] = get(segs[i].first, segs[i].second); mx[i] = R; mn[i] = L == -1 ? INF + 1 : L; } for (int i = 1; i < (int)segs.size(); ++i) { mx[i] = max(mx[i], mx[i - 1]); } for (int i = (int)segs.size() - 2; i >= 0; --i) { mn[i] = min(mn[i], mn[i + 1]); } for (int i = 1; i < (int)segs.size(); ++i) { if (mx[i - 1] != -1 && mn[i] != INF + 1) { res = max(res, mn[i] - mx[i - 1]); } } return res; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...