#include <bits/stdc++.h>
#include <chrono>
#define ll long long int
#define endl '\n'
#define vn vector<ll>
#define vi vector<pair <ll,ll>>
using namespace std;
using namespace std::chrono;
const int MAX_N = 1e9 + 7;
#define pii pair<ll,ll>
const ll INF = 0x3f3f3f3f3f3f3f3f;
#define pb push_back
#define srt(vp) sort(vp.begin(), vp.end())
bool canCover(ll w, const vn &v, int p, int q) {
int n = v.size();
p = min(p, n);
q = min(q, n);
vector<vector<int>> dp(p+1, vector<int>(q+1, -1));
dp[0][0] = 0;
for (int i = 0; i <= p; i++) {
for (int j = 0; j <= q; j++) {
if (dp[i][j] == -1) continue;
int curr = dp[i][j];
if (curr >= n) return true;
if (i < p) {
int k = upper_bound(v.begin(), v.end(), v[curr] + w) - v.begin() - 1;
dp[i+1][j] = max(dp[i+1][j], k + 1);
}
if (j < q) {
int k = upper_bound(v.begin(), v.end(), v[curr] + 2 * w) - v.begin() - 1;
dp[i][j+1] = max(dp[i][j+1], k + 1);
}
}
}
return dp[p][q] >= n;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll n, p, q;
cin >> n >> p >> q;
vn v(n);
for (ll &x : v) cin >> x;
sort(v.begin(), v.end());
ll lo = 1, ho = v[n-1] - v[0];
while (lo <= ho) {
ll mid = (lo + ho) / 2;
if (canCover(mid, v, p, q)) {
ho = mid - 1;
} else {
lo = mid + 1;
}
}
cout << lo << endl;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |