Submission #1343787

#TimeUsernameProblemLanguageResultExecution timeMemory
1343787hyyhWatching (JOI13_watching)C++20
100 / 100
201 ms15420 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
#include <tuple>
#include <math.h>
#include <cstring>
#include <bitset>
#include <queue>

using namespace std;
using ll = long long;
using pii = pair<int,int>;
using piii = tuple<int,int,int>;

#define endl '\n'
#define f first
#define s second
#define all(x) begin(x),end(x)
#define m_p make_pair()

int const INF = 1e9+10;

int main(){
    int n;cin >> n;
    int p;cin >> p;
    int q;cin >> q;
    if(p+q >= n){
        cout << 1;
        return 0;
    }
    vector<int> vc;
    for(int i{};i < n;i++){
        int g;cin >> g;
        vc.emplace_back(g);
    }
    sort(all(vc));
    auto check = [&](int x){
        vector<vector<int>> dp(n+1,vector<int>(q+1,INF));
        dp[0][0] = 0;
        int lx = x*2;
        queue<pii> q1;// pos,ind -> small
        queue<pii> q2;// pos,ind -> large
        for(int i{};i < n;i++){
            while(!q1.empty() && vc[i]-q1.front().f >= x) q1.pop();
            while(!q2.empty() && vc[i]-q2.front().f >= lx) q2.pop();
            for(int j{};j <= q;j++){
                dp[i+1][j] = dp[i][j]+1;
                if(!q1.empty()) dp[i+1][j] = min(dp[i+1][j],dp[q1.front().s][j]+1);
                if(j > 0){
                    dp[i+1][j] = min(dp[i][j-1],dp[i+1][j]);
                    if(!q2.empty()) dp[i+1][j] = min(dp[i+1][j],dp[q2.front().s][j-1]);
                }
                //cout << dp[i+1][j] << " ";
            }
            //cout << endl;
            q1.emplace(vc[i],i);
            q2.emplace(vc[i],i);
        }
        if(dp[n][q] <= p) return true;
        else return false;
    };
    int l = 1;
    int r = 1000000000;
    int ans = r;
    while(l <= r){
        int md = l+(r-l)/2;
        if(check(md)) ans = min(ans,md),r = md-1;
        else l = md+1;
    }
    cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...