제출 #1346605

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

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, p, q;
    cin >> n >> p >> q;

    vector<int> a(n + 1);
    for (int i = 1; i <= n; i++) cin >> a[i];
    sort(a.begin() + 1, a.end());

    p = min(p, n);
    q = min(q, n);

    auto ok = [&](int w) -> bool {
        vector<int> small(n + 2), big(n + 2);

        int r = 1;
        for (int i = 1; i <= n; i++) {
            while (r <= n && a[r] - a[i] <= w - 1) r++;
            small[i] = r;
        }

        r = 1;
        for (int i = 1; i <= n; i++) {
            if (r < i) r = i;
            while (r <= n && a[r] - a[i] <= 2 * w - 1) r++;
            big[i] = r;
        }

        const int INF = 1e9;
        vector<vector<int>> dp(n + 1, vector<int>(p + 1, INF));
        dp[0][0] = 0;

        for (int i = 0; i < n; i++) {
            for (int s = 0; s <= p; s++) {
                if (dp[i][s] == INF) continue;
                if (dp[i][s] > q) continue;

                if (s + 1 <= p) {
                    int ni = small[i + 1] - 1;
                    dp[ni][s + 1] = min(dp[ni][s + 1], dp[i][s]);
                }

                int ni = big[i + 1] - 1;
                dp[ni][s] = min(dp[ni][s], dp[i][s] + 1);
            }
        }

        for (int s = 0; s <= p; s++) {
            if (dp[n][s] <= q) return true;
        }
        return false;
    };

    int l = 1, r = 1000000000, ans = r;
    while (l <= r) {
        int m = l + (r - l) / 2;
        if (ok(m)) {
            ans = m;
            r = m - 1;
        } else {
            l = m + 1;
        }
    }

    cout << ans << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...