Submission #1132624

#TimeUsernameProblemLanguageResultExecution timeMemory
1132624lioowWatching (JOI13_watching)C++20
100 / 100
160 ms31860 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#define pb push_back
#define int long long
#define ll long long
#define repp(i,x,n) for(int i=x;i<=n;i++)
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repo(i,x,n) for(int i=x;i>=n;i--)
#define cy cout<<"Yes"<<endl
#define cn cout<<"No"<<endl
#define r0 return 0
#define fi first
#define se second
#define liow ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define jelek cout<<"jelek"<<endl
#define pii pair<int,int>
#define all(v) v.begin(),v.end()
#define pi pair<pair<int,int>,pair<int,int>>
#define p3 pair<int,pair<int,int>>
#define fl fflush(stdout)
#define lb long double
#define p5 pair<int,pair<pair<int,int>,pair<int,int>>>
#pragma GCC optimize ("O2")
#pragma GCC optimize ("unroll-loops")  
using namespace std;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
using namespace __gnu_pbds;
template <typename T>
using ordered_set = tree<T,null_type,less<T>,rb_tree_tag, tree_order_statistics_node_update>;
const int mod=1e9+7,maxn=2e5+5,N=4e5,INF=1e18,MOD=998244353,LOG=20;
mt19937_64 rng((unsigned int) chrono::steady_clock::now().time_since_epoch().count());

void solve(){
  int n,p,q;cin>>n>>p>>q;
  int a[n+2];
  repp(i,1,n) cin>>a[i];
  sort(a+1,a+n+1);
  int ans=-1;
  int l=1,r=1e9;
  a[n+1]=INF;
  while(l<=r){
    int mid=(l+r)/2;
    int minp=min(2000LL,p);
    int dp[n+2][minp+2];
    repp(i,0,n) repp(j,0,minp) dp[i][j]=INF;
    dp[0][0]=0;
    int nxtp[n+2],nxtq[n+2];
    int idx=1;
    repp(i,1,n){
      int bat=a[i]+mid-1;
      while(a[idx]<=bat){
        idx++;
      }
      nxtp[i]=idx-1;
    }
    idx=1;
    repp(i,1,n){
      int bat=a[i]+2*mid-1;
      while(a[idx]<=bat){
        idx++;
      }
      nxtq[i]=idx-1;
    }
    repp(i,1,n){
      repp(j,0,minp){
        dp[nxtp[i]][j+1]=min(dp[nxtp[i]][j+1],dp[i-1][j]);
        dp[nxtq[i]][j]=min(dp[nxtq[i]][j],dp[i-1][j]+1);
      }
    }
    int mini=INF;
    repp(i,0,minp) mini=min(mini,dp[n][i]);
//    cout<<mid<<" "<<mini<<endl;
    if(mini<=q){
      ans=mid;
      r=mid-1;
    } else {
      l=mid+1;
    }
  }
  cout<<ans<<endl;
}
  

signed main(){
  liow;
  int t=1;
//  cin>>t;
  while(t--) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...