제출 #1154050

#제출 시각아이디문제언어결과실행 시간메모리
1154050dostsWatching (JOI13_watching)C++20
100 / 100
189 ms31848 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define ff first
#define ss second
#define sp << " " <<    
#define all(cont) cont.begin(),cont.end()
#define vi vector<int>
 
const int inf = 1e17,N = 2e6+1,MOD = 998244353,B = 600;
  
array<array<int,2001>,2001> dp;

void solve() {  
    int n,p,q;
    cin >> n >> p >> q;
    vi 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);
    vi coverp(n+1),coverq(n+1);
    queue<int> dq;
    auto check = [&](int w) -> bool {
        for (int i = 0;i<=n;i++) for (int j = 0;j<=p;j++) dp[i][j] = inf;
        
        while (!dq.empty()) dq.pop();
        for (int i = n;i >= 1;i--) {
            while (!dq.empty() && a[dq.front()] > a[i]+w-1) dq.pop();
            dq.push(i);
            coverp[i] = dq.front();
        }
        
        while (!dq.empty()) dq.pop();
        for (int i = n;i >= 1;i--) {
            while (!dq.empty() && a[dq.front()] > a[i]+2*w-1) dq.pop();
            dq.push(i);
            coverq[i] = dq.front();
        }
        dp[0][0] = 0;
        for (int i = 0;i<n;i++) {
            for (int j = 0;j<=p;j++) {
                if (dp[i][j] == inf) continue;
                dp[coverp[i+1]][j+1] = min(dp[coverp[i+1]][j+1],dp[i][j]);
                dp[coverq[i+1]][j] = min(dp[coverq[i+1]][j],dp[i][j]+1);
            }
        }
        for (int i=0;i<=p;i++) if (dp[n][i] <= q) return 1;
        return 0;
    };
    int l = 1;
    int r = 1e9;
    while (l<=r) {
        int w = (l+r) >> 1;
        if (check(w)) r = w-1;
        else l = w+1;
    }
    cout << l << '\n';

}

int32_t main() { 
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    #ifdef Dodi 
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
    #endif
    int t = 1;
    //cin >> t;
    while (t --> 0) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...