Submission #355794

#TimeUsernameProblemLanguageResultExecution timeMemory
355794eyangchWatching (JOI13_watching)C++17
100 / 100
244 ms16236 KiB
#include <bits/stdc++.h>

using namespace std;

int N, P, Q;
int a[100000];
int dp[2001][2001]; // [num of events][large cameras]
int jmps[2001], jmpl[2001];

bool works(int mid){
    fill(dp[0], dp[N]+Q+1, 1e9);
    fill(dp[0], dp[0]+Q+1, 0);
    iota(jmps, jmps+N+1, -1);
    iota(jmpl, jmpl+N+1, -1);
    for(int i = N-1; i >= 0; i--){
        int idxs = upper_bound(a, a+N, a[i]-mid) - a - 1;
        int idxl = upper_bound(a, a+N, a[i]-2*mid) - a - 1;
        //cout << idxs << " " << idxl << endl;
        jmps[i] = idxs;
        jmpl[i] = idxl;
    }
    /*for(int i = 0; i < N; i++){
        cout << jmps[i] << " ";
    }cout << endl;
    for(int i = 0; i < N; i++){
        cout << jmpl[i] << " ";
    }cout << endl;*/
    for(int i = 1; i <= N; i++){
        int pvs = jmps[i-1]+1;
        int pvl = jmpl[i-1]+1;
        dp[i][0] = dp[pvs][0] + 1;
        for(int j = 1; j <= Q; j++){
            dp[i][j] = min(dp[pvl][j-1], dp[pvs][j] + 1);
        }
    }
    /*int pvsN = jmps[N];
    int pvlN = jmpl[N];
    //cout << pvsN << " " << pvlN << endl;
    return (min(dp[pvlN][Q-1], dp[pvsN][Q]+1) <= P);*/
    return (dp[N][Q] <= P);
}

int32_t main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N >> P >> Q;
    if(P+Q >= N){
        cout << 1 << endl;
        return 0;
    }
    for(int i = 0; i < N; i++){
        cin >> a[i];
    }
    sort(a, a+N);
    int lo = 0, hi = 1e9, mid = 0;
    //cout << works(4) << endl;
    while(lo < hi){
        mid = (lo + hi) / 2;
        if(works(mid)){
            hi = mid-1;
        }else{
            lo = mid+1;
        }
    }
    while(works(mid)) mid--;
    while(!works(mid)) mid++;
    cout << mid << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...