Submission #1322049

#TimeUsernameProblemLanguageResultExecution timeMemory
1322049i_love_springWatching (JOI13_watching)C++20
50 / 100
1095 ms19580 KiB
#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;

void solve() {
    int n, p, q;
    cin >> n >> p >> q;
    vector<int> a(n);
    for (int i = 0; i < n;i++) 
        cin >> a[i];
    
    if (p + q >= n)
        return (void)(cout << 1); 

    // a.insert(a.begin(), 0);
    a.push_back(0);
    sort(a.begin(), a.end());
    
    vector dp(n + 1, vector(q + 1, p + 5));
    deque<ar<int, 2>> sm[q + 1], big[q + 1];

    auto f = [&](int w) {

        for (int i = 0; i <= n;i++)
            for (int j = 0; j <= q;j++) 
                dp[i][j] = p + 10;
        dp[0].assign(q + 1, 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++) {
                
                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[i - 1][j]) break;
                    sm[j].pop_back();
                }

                while (!big[j].empty()) {
                    auto [x, id] = big[j].back();
                    if (x < dp[i - 1][j]) break;
                    big[j].pop_back();
                }    

                sm[j].push_back({dp[i - 1][j], i});
                big[j].push_back({dp[i - 1][j], i});

                if (!sm[j].empty()) 
                    dp[i][j] = min(dp[i][j], (*sm[j].begin())[0] + 1);
                
                if (j > 0 && !big[j - 1].empty())
                    dp[i][j] = min(dp[i][j], (*big[j - 1].begin())[0]); 
            }
        }

        int ans = *min_element(dp[n].begin(), dp[n].end());
        return ans;

    };  

    int l = 1, r = 1e9, ans = 1e9;
    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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...