Submission #1308160

#TimeUsernameProblemLanguageResultExecution timeMemory
1308160khf7000Global Warming (CEOI18_glo)C++20
100 / 100
150 ms6984 KiB
#include <bits/stdc++.h>
// #pragma GCC optimize("Ofast")
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
int inf = 1e9 + 1;
int mod = 1e9 + 7;

int query (vector<int> &seg, int node, int start, int end, int left, int right) {
    if (right < start || end < left) return 0;
    if (left <= start && end <= right) return seg[node];
    int mid = (start + end) / 2;
    return max(query(seg, node * 2, start, mid, left, right), query(seg, node * 2 + 1, mid + 1, end, left, right));
}

void update (vector<int> &seg, int node, int start, int end, int target, int val) {
    if (target < start || end < target) return;
    if (start == end) {
        seg[node] = max(seg[node], val);
        return;
    }

    int mid = (start + end) / 2;
    update(seg, node * 2, start, mid, target, val);
    update(seg, node * 2 + 1, mid + 1, end, target, val);
    seg[node] = max(seg[node * 2], seg[node * 2 + 1]);
}

int main() {
    cin.tie(NULL);
    cout.tie(NULL);
    ios_base::sync_with_stdio(false);

    int n, x;
    cin >> n >> x;
    
    vector<int> a (n, 0);
    for(int i = 0; i < n; i++) {
        cin >> a[i];
    }

    vector<int> v;
    vector<int> pre (n, 0);
    for(int i = 0; i < n; i++) {
        auto it = lower_bound(v.begin(), v.end(), a[i]);
        int j = it - v.begin();
        if (it == v.end()) {
            v.push_back(a[i]);
        } else {
            v[j] = a[i];
        }
        pre[i] = j + 1;
    }

    v.clear();
    vector<int> suf (n, 0);
    for(int i = n - 1; i >= 0; i--) {
        auto it = lower_bound(v.begin(), v.end(), -a[i]);
        int j = it - v.begin();
        if (it == v.end()) {
            v.push_back(-a[i]);
        } else {
            v[j] = -a[i];
        }
        suf[i] = j + 1;        
    }

    vector<int> b (n, 0);
    for(int i = 0; i < n; i++) {
        b[i] = a[i] + x;
    }
    sort(b.begin(), b.end());
    b.erase(unique(b.begin(), b.end()), b.end());

    // printf("pre: ");
    // for(int i = 0; i < n; i++) {
    //     printf("%d ", pre[i]);
    // }
    // printf("\nsuf: ");
    // for(int i = 0; i < n; i++) {
    //     printf("%d ", suf[i]);
    // }
    // printf("\nb: ");
    // for(int i = 0; i < b.size(); i++) {
    //     printf("%d ", b[i]);
    // }
    // printf("\n");

    int m = (int)b.size();
    vector<int> seg (4*m, 0);
    int ans = *max_element(pre.begin(), pre.end());
    for(int i = n - 1; i > 0; i--) {
        int j = lower_bound(b.begin(), b.end(), a[i] + x) - b.begin();
        update(seg, 1, 0, m - 1, j, suf[i]);

        int k = upper_bound(b.begin(), b.end(), a[i - 1]) - b.begin();
        if (k < m) {
            ans = max(ans, pre[i - 1] + query(seg, 1, 0, m - 1, k, m - 1));
        }
    }
    cout << ans << "\n";
}
#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...