# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
41259 | 2018-02-15T08:05:39 Z | Just_Solve_The_Problem | Gap (APIO16_gap) | C++11 | 0 ms | 0 KB |
//#include <gap.h> #include <bits/stdc++.h> #include "grader.cpp" #define ll long long const int inf = (int)1e9 + 7; using namespace std; ll solve1(int n) { long long left; long long right; left = 0; right = 1e18; long long mn = 0, mx = 1e18; long long vec[n]; int cnt = 0; int cn = n - 1; while (cnt <= cn) { MinMax(left, right, &mn, &mx); vec[cnt++] = mn; if (mn != mx) vec[cn--] = mx; left = mn + 1; right = mx - 1; } long long ans = 0; for (int i = 1; i < n; i++) { if (vec[i] - vec[i - 1] > ans) { ans = vec[i] - vec[i - 1]; } } return ans; } ll findGap(int t, int n) { if (t == 1) { return solve1(n); } ll l, r; MinMax(0, 1e18, &l, &r); if (n == 2) { return r - l; } else if (r - l + 1 == n) { return 1; } if(r - l + 1 == n + 1) { return 2; } ll dif = (r - l + 1) / (n + 1); ll x = (r - l + 1) % (n + 1); if (x) dif++; ll start = l; ll fin = start + dif - 1; ll fre = 0; ll mx = 0; ll ans = 0; ll blockes = 0; while (1) { ll l1, r1; MinMax(start, fin, &l1, &r1); blockes++; x--; // cout << blockes << ' ' << dif << endl; // cout << start << ' ' << fin << endl; if (l1 == -1) { fre += dif; } else { if (fre != 0) { ans = max(ans, fre + mx + (l1 - start + 1)); } fre = 0; mx = fin - r1; } if (fin == r) break; if (x <= 0) { dif--; x = inf; } start = fin + 1; fin = min(start + dif - 1, r); } return ans; }