Submission #1239477

#TimeUsernameProblemLanguageResultExecution timeMemory
1239477minhpkWatching (JOI13_watching)C++20
100 / 100
170 ms15420 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll INF = (ll)1e18;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int a, b, c;
    cin >> a >> b >> c;
    vector<ll> z(a+1);
    for(int i = 1; i <= a; i++){
        cin >> z[i];
    }

    if ((ll)b + c >= a){
        cout << 1 << "\n";
        return 0;
    }

    sort(z.begin()+1, z.end());


    vector<vector<int>> dp(a+1, vector<int>(b+1, INT_MAX));

    auto check = [&](ll w){
        for(int i = 0; i <= a; i++)
            for(int j = 0; j <= b; j++)
                dp[i][j] = INT_MAX;
        dp[0][0] = 0;

        for(int i = 1; i <= a; i++){
            int l = lower_bound(z.begin()+1, z.begin()+i+1, z[i] - w+1) - z.begin();
            int k = lower_bound(z.begin()+1, z.begin()+i+1, z[i] - 2*w+1) - z.begin();

            for(int j = 0; j <= b; j++){
                if (j > 0 && dp[l-1][j-1] != INT_MAX){
                    dp[i][j] = min(dp[i][j], dp[l-1][j-1]);
                }
                if (dp[k-1][j] != INT_MAX){
                    dp[i][j] = min(dp[i][j], dp[k-1][j] + 1);
                }
            }
        }

        for(int j = 0; j <= b; j++){
            if (dp[a][j] <= c) return true;
        }
        return false;
    };

    ll lo = 0, hi = (ll)1e9, ans = hi;
    while(lo <= hi){
        ll mid = lo + (hi - lo)/2;
        if (check(mid)){
            ans = mid;
            hi = mid - 1;
        } else {
            lo = mid + 1;
        }
    }

    cout << ans << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...