Submission #1191759

#TimeUsernameProblemLanguageResultExecution timeMemory
1191759nagorn_ph구경하기 (JOI13_watching)C++20
0 / 100
192 ms1312 KiB
#include <bits/stdc++.h>
#define int long long
#define all(a) a.begin(), a.end()
#define emb emplace_back

using namespace std;

const int inf = 1e18;

int n, p, q; 
set <int> aa;
vector <int> a;

bool can(int mid){
    // cout << mid << ": \n";
    vector <vector <int>> dp(p + 1, vector <int> (q + 1));
    int mx = 0;
    for (int i = 0; i <= p; i++) {
        for (int j = 0; j <= q; j++) {
            if (i == 0 && j == 0) continue;
            int pp = 0, qq = 0;
            if (i > 0) pp = upper_bound(all(a), a[dp[i - 1][j]] + mid - 1) - a.begin();
            if (j > 0) qq = upper_bound(all(a), a[dp[i][j - 1]] + mid + mid - 1) - a.begin();
            pp = min(pp, (int)a.size() - 1);
            qq = min(qq, (int)a.size() - 1);
            dp[i][j] = max(pp, qq);
            // mx = max(mx, dp[i][j]);
            // cout << i << ", " << j << ": " << dp[i][j] << "\n";
        }
    }
    // cout << "--------------\n";
    return dp[p][q] >= (a.size() - 1);
}

int32_t main(){
    cin.tie(NULL)->sync_with_stdio(false);
    cin >> n >> p >> q;
    if (p + 2 * q >= n) {
        cout << 1;
        return 0;
    }
    for (int i = 0; i < n; i++) {
        int x; cin >> x;
        aa.insert(x);
    }
    a = vector <int> (all(aa));
    a.emb(1e9);
    int l = 1, r = inf, ans = inf;
    while (l <= r) {
        int mid = (l + r) / 2;
        if (can(mid)) {
            r = mid - 1;
            ans = mid;
        }
        else l = mid + 1;
    }
    cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...