Submission #1280154

#TimeUsernameProblemLanguageResultExecution timeMemory
1280154ducanh0811Global Warming (CEOI18_glo)C++20
100 / 100
226 ms33384 KiB
#include <bits/stdc++.h>
#define int long long
#define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; ++i)
#define REV(i, a, b) for (int i = (a), _b = (b); i >= _b; --i)
using namespace std;

#define MAXN 200005
int n, x;
int a[MAXN];
int b[MAXN];
int rev_lis[MAXN];
int lis[MAXN];
vector<int> comp;

struct SMT {
    int n;
    vector<int> st;
    SMT(int _n = 0){
        n = _n;
        st.assign((n << 2) + 5, 0);
    }

    void upd(int id, int l, int r, int p, int val) {
        if (p < l || r < p) return;
        if (l == r){
            st[id] = max(st[id], val);
            return;
        }
        int mid = (l + r) >> 1;
        upd(id << 1, l, mid, p, val);
        upd(id << 1 | 1, mid + 1, r, p, val);
        st[id] = max(st[id << 1], st[id << 1 | 1]);
    }

    void upd(int p, int val){
        upd(1, 1, n, p, val);
    }

    int get(int id, int l, int r, int u, int v){
        if (v < l || r < u) return 0;
        if (u <= l && r <= v) return st[id];
        int mid = (l + r) >> 1;
        return max(get(id << 1, l, mid, u, v), get(id << 1 | 1, mid + 1, r, u, v));
    }

    int get(int u, int v){
        return get(1, 1, n, u, v);
    }
};

void compression(){
    FOR(i, 1, n){
        comp.push_back(a[i]);
        comp.push_back(b[i]);
    }
    sort(comp.begin(), comp.end());
    comp.erase(unique(comp.begin(), comp.end()), comp.end());
    FOR(i, 1, n){
        a[i] = lower_bound(comp.begin(), comp.end(), a[i]) - comp.begin() + 1;
        b[i] = lower_bound(comp.begin(), comp.end(), b[i]) - comp.begin() + 1;
    }
}

void solve(){
    cin >> n >> x;
    FOR(i, 1, n) {
        cin >> a[i];
    }
    FOR(i, 1, n){
        b[i] = a[i] - x;
    }
    compression();
    SMT tree(comp.size());
    REV(i, n, 1){
        int val = tree.get(a[i] + 1, comp.size());
        rev_lis[i] = val + 1;
        tree.upd(a[i], rev_lis[i]);
    }
    tree = SMT(comp.size());
    int res = 0;
    FOR(i, 1, n) {

        // try to get res
        int best = tree.get(1, a[i] - 1);
        res = max(res, best + rev_lis[i]);

        int val = tree.get(1, b[i] - 1);
        lis[i] = val + 1;
        tree.upd(b[i], lis[i]);
    }

    cout << res;
}

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    solve();
    return 0;
}
#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...