제출 #110756

#제출 시각아이디문제언어결과실행 시간메모리
110756TAISA_Gap (APIO16_gap)C++14
100 / 100
88 ms2740 KiB
#include "gap.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
/*void MinMax(ll l, ll r, ll& mi, ll& ma) {
    cout << l << " " << r << endl;
    cin >> mi >> ma;
}*/
ll findGap(int T, int n) {
    ll INF = 1000000000000000000LL;
    ll N = n;
    ll mi, ma;
    MinMax(0LL, INF, &mi, &ma);
    if(N == ma - mi + 1LL) {
        return 1LL;
    }
    if(T == 1) {
        vector<ll> v1, v2;
        v1.push_back(mi);
        v2.push_back(ma);
        for(int i = 0; i < N / 2 - 1; i++) {
            MinMax(mi + 1LL, ma - 1LL, &mi, &ma);
            v1.push_back(mi);
            v2.push_back(ma);
        }
        if(N % 2) {
            MinMax(mi + 1LL, ma - 1LL, &mi, &ma);
            v1.push_back(mi);
        }
        reverse(v2.begin(), v2.end());
        for(auto e : v2) {
            v1.push_back(e);
        }
        ll res = 0;
        for(int i = 1; i < N; i++) {
            res = max(res, v1[i] - v1[i - 1]);
        }
        return res;
    } else {
        ll l = (ma - mi + 1LL) / N + 1LL, m = (ma - mi + 1LL) % N;
        ll b = mi, res = 0, t = mi, s = 0, maa = ma;
        bool f = false;
        for(int i = 0; i < N - 1; i++) {
            ll nl = l - (i >= m);
            MinMax(t, t + nl - 1LL, &mi, &ma);
            if(mi == -1) {
                if(f) {
                    s += nl;
                } else {
                    s += nl + (t - b);
                    f = true;
                }
            } else {
                if(f) {
                    s += mi - t;
                    res = max(res, s);
                    s = 0;
                    f = false;
                } else {
                    res = max(res, mi - b);
                }
                b = ma;
            }
            t += nl;
        }
        MinMax(t, maa - 1, &mi, &ma);
        if(mi == -1) {
            if(f) {
                s += maa - t;
                res = max(res, s);
            } else {
                res = max(res, maa - b);
            }
        } else {
            if(f) {
                s += mi - t;
                res = max(res, s);
            } else {
                res = max(res, mi - b);
            }
        }
        return res;
    }
}
/*int main() {
    cout << findGap(0, 4) << endl;
}*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...