Submission #1310078

#TimeUsernameProblemLanguageResultExecution timeMemory
1310078qrnGlobal Warming (CEOI18_glo)C++20
22 / 100
448 ms39584 KiB
#include "bits/stdc++.h"
using namespace std;
#define intt long long
#define fi first
#define se second
#define endl "\n"

const intt mxN = 2e5+67;
const intt LG = 20;
const intt inf = 1e18; 
const intt mod = 1e9 + 7;
const intt p = 997;

vector<intt> a(mxN), dpL(mxN), dpR(mxN), seg(4 * mxN), seg2(4*mxN);
map<intt,intt> comp;
set<intt> st;
intt avil = 1;

void update(intt node, intt l, intt r, intt pos, intt val, vector<intt> &seg) {
    if(l == r) {
        seg[node] = val;
        return;
    }
    intt mid = (l + r) / 2;
    if(pos <= mid) {
        update(node * 2, l, mid, pos, val, seg);
    } else {
        update(node * 2 + 1, mid + 1, r, pos, val, seg);
    }
    seg[node] = max(seg[node * 2], seg[node * 2 + 1]);
}


intt get(intt node, intt l, intt r, intt ql, intt qr, vector<intt> &seg) {
    if(ql > r || qr < l || ql > qr) return 0ll;
    if(ql <= l && r <= qr) {
        return seg[node];
    }
    intt mid = (l + r) / 2;
    return max(get(node * 2, l, mid, ql, qr, seg), get(node * 2 + 1, mid + 1, r, ql, qr, seg));
}

void smile() {
    intt n, k;
    cin >> n >> k;
    for(intt i = 0; i < n; i++) {
        cin >> a[i];
        st.insert(a[i]);
    }
    st.insert(k);
    for(auto u : st) {
        comp[u] = avil++;
    }
    k = comp[k];
    for(intt i = 0; i < n; i++) a[i] = comp[a[i]];

    dpL[0] = 1ll;
    update(1, 1, avil, a[0], dpL[0], seg);
    for(intt i = 1; i < n; i++) {
        intt g = get(1, 1, avil, 1, a[i]-1, seg);
        dpL[i] = (g + 1);
        update(1, 1, avil, a[i], dpL[i], seg);
    }

    seg.assign(4 * avil + 1, 0ll);
    dpR[n-1] = 1;
    update(1, 1, avil, a[n-1], 1ll, seg);
    update(1, 1, avil, a[n-1], 1ll, seg2);
    // for(intt i = 0; i < n; i++) cout << a[i] << " ";
    // cout << endl;
    for(intt i = n - 2; i >= 0; i--) {
        intt g = get(1, 1, avil, a[i]-k+1, avil, seg);
        intt g2 = get(1, 1, avil, a[i]+1, avil, seg2);
        dpR[i] = (g + 1);
        update(1, 1, avil, a[i], g2 + 1, seg);
        update(1, 1, avil, a[i], g2 + 1, seg2);
    }
    intt ans = 0;
    for(intt i = 0; i < n; i++) {
        // cout << i << ": " << dpL[i] << " " << dpR[i] << endl;
        ans = max(ans, dpL[i] + dpR[i] - 1);
    }
    cout << ans << endl;
}

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

    // freopen("island.in", "r", stdin);
    // freopen("island.out", "w", stdout)

    intt t = 1, buu = 1;
    // cin >> t;
    while(t--){
        // cout << endl;
        // cout << "Case #" << buu++ << ": ";
        smile();
    }
}
#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...