| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1327535 | Johan | 구경하기 (JOI13_watching) | C++20 | 0 ms | 0 KiB |
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e3 + 5;
const int INF = 1e18;
int n, p, q, a[N], dp[N][N];
bool ok(int x){
memset(dp, 0, sizeof(dp));
for(int i = 0; i <= p; i++){
for(int j = 0; j <= q; j++){
if(i > 0){
int l = dp[i - 1][j] + 1, r = n;
int cur = a[l] + x - 1, best1 = n + 1;
while(r >= l){
int mid = (l + r) >> 1;
if(a[mid] > cur){
best1 = mid;
r = mid - 1;
}
else l = mid + 1;
}
dp[i][j] = max({dp[i][j], dp[i - 1][j], best1 - 1});
}
if(j > 0){
int l = dp[i][j - 1] + 1, r = n;
int cur = a[l] + 2 * x - 1, best2 = n + 1;
while(r >= l){
int mid = (l + r) >> 1;
if(a[mid] > cur){
best2 = mid;
r = mid - 1;
}
else l = mid + 1;
}
dp[i][j] = max({dp[i][j], dp[i][j - 1], best2 - 1});
}
}
}
return (dp[p][q] == n);
}
signed main(){
ios_base:sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> p >> q;
p = min(p, n);
q = min(q, n);
for(int i = 1; i <= n; i++)
cin >> a[i];
sort(a + 1, a + n + 1);
int l = 1, r = INF;
int best = -1;
while(r >= l){
int mid = (l + r) >> 1;
if(ok(mid) == true){
best = mid;
r = mid - 1;
}
else l = mid + 1;
}
cout << best << endl;
}