Submission #753683

#TimeUsernameProblemLanguageResultExecution timeMemory
753683sheldonGlobal Warming (CEOI18_glo)C++14
62 / 100
59 ms10800 KiB
#include <bits/stdc++.h>

using namespace std;

void solve() {

    int n, x;
    cin >> n >> x;
    vector<int> a(n);
    vector<int> dp1, dp2;
    vector<vector<int>> prev(n);
    vector<int> where(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }
    for (int i = n - 1; i >= 0; --i) {
        int l = 0, r = (int) dp2.size() - 1;
        int idx = -1;
        while (l <= r) {
            int mid = (l + r) / 2;
            if (dp2[mid] > a[i]) {
                l = mid + 1;
            } else if (dp2[mid] < a[i]) {
                r = mid - 1;
                idx = mid;
            } else {
                idx = mid;
                break;
            }
        }
        if (idx == -1) {
            dp2.push_back(-1);
            idx = dp2.size() - 1;
        }
        where[i] = idx;
        prev[idx].push_back(a[i]);
        dp2[idx] = a[i];
    }
    int ans = -1;
    for (int i = 0; i < n; ++i) {
        int loc = where[i];
        prev[loc].pop_back();
        if (prev[loc].empty()) {
            dp2.pop_back();
        } else {
            dp2[loc] = prev[loc].back();
        }
        auto it = lower_bound(dp1.begin(), dp1.end(), a[i] - x);
        if (it == dp1.end()) {
            dp1.push_back(a[i] - x);
        } else {
            *it = a[i] - x;
        }
        int l = 0, r = (int) dp2.size() - 1;
        int idx = -1;
        while (l <= r) {
            int mid = (l + r) / 2;
            if (dp2[mid] > dp1.back()) {
                idx = mid;
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
        ans = max(ans, (int) dp1.size() + idx + 1);
    }
    cout << max(ans, (int) dp1.size());
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...