제출 #1191741

#제출 시각아이디문제언어결과실행 시간메모리
1191741nagorn_ph구경하기 (JOI13_watching)C++20
0 / 100
1093 ms18248 KiB
#include <bits/stdc++.h>
#define int long long
#define all(a) a.begin(), a.end()

using namespace std;

const int inf = 1e18;

int n, p, q, go[2005][2005]; 
set <int> aa;
vector <int> a;

bool can(int mid){
    // cout << mid << ": \n";
    vector <vector <int>> dp(p + 1, vector <int> (q + 1));
    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();
            dp[i][j] = max(pp, qq);
            // cout << i << ", " << j << ": " << dp[i][j] << "\n";
        }
    }
    // cout << "--------------\n";
    return dp[p][q] >= a.size();
}

int32_t main(){
    cin.tie(NULL)->sync_with_stdio(false);
    cin >> n >> p >> q;
    if (p > n) p = n;
    if (q > n) q = n;
    for (int i = 0; i < n; i++) {
        int x; cin >> x;
        aa.insert(x);
    }
    a = vector <int> (all(aa));
    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...