#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ar array
#define all(x) x.begin(), x.end()
const int inf = 2e9 + 5;
static int dp[2005], ndp[2005], a[2005];
deque<ar<int, 2>> sm[2008], big[2008];
int n, p, q;
int f(int w) {
for (int i = 0; i <= q;i++)
ndp[i] = p + 10;
ndp[0] = 0;
for (int i = 0; i <= q;i++) {
while (!sm[i].empty()) sm[i].pop_back();
while (!big[i].empty()) big[i].pop_back();
}
for (int i = 1; i <= n;i++) {
for (int j = 0; j <= q;j++) {
dp[j] = ndp[j];
ndp[j] = p + 10;
}
for (int j = 0; j <= q;j++) {
while (!sm[j].empty()) {
auto [x, id] = sm[j].front();
if (a[i] - a[id] + 1 <= w) break;
sm[j].pop_front();
}
while (!big[j].empty()) {
auto [x, id] = big[j].front();
if (a[i] - a[id] + 1 <= w * 2) break;
big[j].pop_front();
}
while (!sm[j].empty()) {
auto [x, id] = sm[j].back();
if (x < dp[j]) break;
sm[j].pop_back();
}
while (!big[j].empty()) {
auto [x, id] = big[j].back();
if (x < dp[j]) break;
big[j].pop_back();
}
sm[j].push_back({dp[j], i});
big[j].push_back({dp[j], i});
if (!sm[j].empty())
ndp[j] = min(ndp[j], (sm[j].front())[0] + 1);
if (j > 0 && !big[j - 1].empty())
ndp[j] = min(ndp[j], (big[j - 1].front())[0]);
}
}
int ans = inf;
for (int i = 0; i <= q;i++) ans = min(ans, ndp[i]);
return ans;
}
void solve() {
cin >> n >> p >> q;
a[0] = 0;
for (int i = 1; i <= n;i++)
cin >> a[i];
if (p + q >= n)
return (void)(cout << 1);
sort(a + 1, a + n + 1);
// for (int i = 0; i <= n;i++) cout << a[i] << " ";
int l = 1, r = a[n] - a[1] + 1, ans = a[n] - a[1] + 1;
while (l <= r) {
int m = (l + r) / 2;
if (f(m) <= p) r = m - 1, ans = m;
else l = m + 1;
}
cout << ans;
}
signed main() {
ios :: sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
// cin >> t;
while (t--) {
solve();
cout << "\n";
}
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |