Submission #1329627

#TimeUsernameProblemLanguageResultExecution timeMemory
1329627Agageldi구경하기 (JOI13_watching)C++20
100 / 100
306 ms31792 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define N 200005

const int inf = 1e18;

int tc = 1, n, a[N], x, y, dp[2001][2001];
bool solve(int w) {
    for(int i = 1; i <= n; i++) {
        for(int j = 0; j <= n; j++) {
            dp[i][j] = inf;
        }
    }
    int l = a[1];
    dp[1][0] = 1;
    for(int i = 2; i <= n; i++) {
        dp[i][0] = dp[i-1][0];
        dp[i][0] += (a[i] - l + 1 > w);
        if(a[i] - l + 1 > w) l = a[i];
    }
    for(int i = 1; i <= n; i++) {
        int l1 = 1, l2 = 1;
        for(int j = 1; j <= x; j++) {
            while(l1 <= n && a[l1] < a[i] - w + 1) l1++;
            while(l2 <= n && a[l2] < a[i] - (2 * w) + 1) l2++;
            dp[i][j] = dp[l1 - 1][j] + 1;
            dp[i][j] = min(dp[i][j], dp[l2 - 1][j - 1]);
        }
    }
    return (dp[n][x] <= y);
}

int32_t main() {
    ios::sync_with_stdio(0);cin.tie(0);
    cin >> n >> y >> x;
    x = min(x, n);
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    sort(a+1,a+n+1);
    int l = 1, r = 1e9;
    while(l <= r) {
        int mid = (l + r) / 2;
        if(solve(mid)) {
            r = mid - 1;
        }
        else {
            l = mid + 1;
        }
    }
    cout << r + 1 << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...