제출 #40796

#제출 시각아이디문제언어결과실행 시간메모리
40796ssnsarang2023Gap (APIO16_gap)C++14
30 / 100
85 ms2284 KiB
#include <bits/stdc++.h> #include "gap.h" using namespace std; typedef long long ll; //#define DEBUG #ifdef DEBUG int n = 5; ll a[5] = {2, 3, 6, 8, 12}; void MinMax(ll x, ll y, ll *mn, ll *mx) { for (int i = 0; i < n; ++i) if (a[i] >= x) { (*mn) = a[i]; break; } for (int i = n - 1; i >= 0; --i) if (a[i] <= y) { (*mx) = a[i]; break; } if ((*mx) < (*mn)) (*mx) = (*mn) = -1; } #endif ll findGap(int _t, int _n) { ll n = _n; ll mn = 1, mx = (ll)1e18; MinMax(mn, mx, &mn, &mx); if (_t == 2) { ll d = (mx - mn) / (n - 1ll) + ((mx - mn) % (n - 1ll) != 0ll), pre = mn; ll pstep = mn, step = mn + d - 1, gap = 0; while (1) { ll mntmp = -1, mxtmp = -1; if (pstep <= min(mx - 1, step)) MinMax(pstep + 1, min(mx - 1, step), &mntmp, &mxtmp); if (step >= mx) { if (mxtmp != -1) gap = max(gap, mx - mxtmp); else gap = max(gap, mx - pre); break; } else if (mntmp != -1) gap = max(gap, mntmp - pre); pre = max(pre, mxtmp), pstep = step, step += d; } return gap; } else { vector<ll> a; a.resize(n); a[0] = mn, a[n - 1] = mx; int lo = 0, hi = n - 1; while (hi - lo > 1) { MinMax(a[lo] + 1ll, a[hi] - 1ll, &mn, &mx); ++lo, --hi; a[lo] = mn, a[hi] = mx; } ll gap = 0; for (int i = 0; i < n - 1; ++i) gap = max(gap, a[i + 1] - a[i]); return gap; } return 0ll; } #ifdef DEBUG int main() { printf("%d", findGap(1, 5)); return 0; } #endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...