# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
34572 | sinhriv | Watching (JOI13_watching) | C++14 | 1000 ms | 20968 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
const int N = 2202;
int n, p, q;
int a[N];
int f[N][N];
int main(){
if(fopen("1.inp", "r")){
freopen("1.inp", "r", stdin);
}
scanf("%d%d%d", &n, &p, &q);
for(int i = 1; i <= n; ++i){
scanf("%d", a + i);
}
p = min(p, n);
q = min(q, n);
sort(a + 1, a + n + 1);
int low = 1, high = 1e9, ans = 1e9;
while(low <= high){
int w = (low + high) >> 1;
memset(f, 60, sizeof f);
f[0][0] = 0;
bool ok = false, debug = false;
for(int j = 0; j <= p; ++j){
deque < int > one, two;
for(int i = 1; i <= n; ++i){
while(!one.empty() && a[i] - a[one.front() + 1] + 1 > w){
one.pop_front();
}
while(!two.empty() && a[i] - a[two.front() + 1] + 1 > w + w){
two.pop_front();
}
if(j > 0){
while(!one.empty() && f[one.back()][j - 1] >= f[i - 1][j - 1]) one.pop_back();
one.push_back(i - 1);
}
while(!two.empty() && f[two.back()][j] >= f[i - 1][j]) two.pop_back();
two.push_back(i - 1);
if(!one.empty()) f[i][j] = min(f[i][j], f[one.front()][j - 1]);
if(!two.empty()) f[i][j] = min(f[i][j], f[two.front()][j] + 1);
if(i == n && f[i][j] <= q){
ok = true;
}
}
}
if(ok == false){
low = w + 1;
}
else{
ans = w;
high = w - 1;
}
}
cout << ans;
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |