# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1132622 | lioow | Watching (JOI13_watching) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#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>>>
using namespace std;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
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();
}