제출 #1184611

#제출 시각아이디문제언어결과실행 시간메모리
1184611peteza구경하기 (JOI13_watching)C++20
100 / 100
194 ms16196 KiB
#include <bits/stdc++.h>
using namespace std;

int n, p, q;

int dp[2005][2005];
int dep[2005];
int longestjump[2005][2];

int main() {
    cin.tie(0) -> sync_with_stdio(0);
    cin >> n >> p >> q;
    for(int i=1;i<=n;i++) {
        cin >> dep[i];
    }
    int l = 1, r = 1000000003, mid;
    p = min(p, 2001); q = min(q, 2001);
    sort(dep+1, dep+n+1);
    while(l <= r) {
        mid = (l+r) >> 1;
        memset(dp, 0, sizeof dp);
        for(int i=1;i<=n;i++) {
            longestjump[i][0] = (upper_bound(dep+1, dep+n+1, dep[i] + mid - 1) - dep) - 1;
            longestjump[i][1] = (upper_bound(dep+1, dep+n+1, dep[i] + min(1010000000, 2*mid - 1)) - dep) - 1;
        }
        for(int i=0;i<=p;i++) {
            for(int j=0;j<=q;j++) {
                if(dp[i][j] == n) {
                    dp[i+1][j] = dp[i][j+1] = n;
                    continue;
                }
                dp[i+1][j] = max(dp[i+1][j], longestjump[dp[i][j]+1][0]);
                dp[i][j+1] = max(dp[i][j+1], longestjump[dp[i][j]+1][1]);
            }
        }
        if(dp[p][q] < n) l = mid + 1;
        else r = mid - 1;
    }
    cout << l;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...