제출 #785214

#제출 시각아이디문제언어결과실행 시간메모리
785214kebineGlobal Warming (CEOI18_glo)C++17
100 / 100
470 ms29864 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define ld long double
#define fi first
#define se second

int a[200005], st1[1000005], st2[1000005], id[200005];
set<int> s;
priority_queue<pair<int, int>> pq[200005];

void update1(int x, int tl, int tr, int pos) {
    if (tl == tr) {
        st1[x] = pq[tl].top().fi;
        return;
    }
    int tm = (tl + tr) / 2;
    if (pos <= tm) update1(2 * x, tl, tm, pos);
    else update1(2 * x + 1, tm + 1, tr, pos);
    st1[x] = max(st1[2 * x], st1[2 * x + 1]);
}

void update2(int x, int tl, int tr, int pos, int i) {
    if (tl == tr) {
        while (!pq[tl].empty() and pq[tl].top().se >= i) pq[tl].pop();
        if (pq[tl].empty()) st1[x] = 0;
        else st1[x] = pq[tl].top().fi;
        return;
    }
    int tm = (tl + tr) / 2;
    if (pos <= tm) update2(2 * x, tl, tm, pos, i);
    else update2(2 * x + 1, tm + 1, tr, pos, i);
    st1[x] = max(st1[2 * x], st1[2 * x + 1]);
}

void update3(int x, int tl, int tr, int pos, int val) {
    if (tl == tr) {
        st2[x] = max(st2[x], val);
        return;
    }
    int tm = (tl + tr) / 2;
    if (pos <= tm) update3(2 * x, tl, tm, pos, val);
    else update3(2 * x + 1, tm + 1, tr, pos, val);
    st2[x] = max(st2[2 * x], st2[2 * x + 1]);
}

int get1(int x, int l, int r, int tl, int tr) {
    if (l > r) return 0;
    if (l == tl and r == tr) return st1[x];
    int tm = (tl + tr) / 2;
    return max(get1(2 * x, l, min(r, tm), tl, tm), get1(2 * x + 1, max(l, tm + 1), r, tm + 1, tr));
}

int get2(int x, int l, int r, int tl, int tr) {
    if (l > r) return 0;
    if (l == tl and r == tr) return st2[x];
    int tm = (tl + tr) / 2;
    return max(get2(2 * x, l, min(r, tm), tl, tm), get2(2 * x + 1, max(l, tm + 1), r, tm + 1, tr));
}

int main() { 
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    int n, x, ans = 1;
    cin >> n >> x;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        s.insert(a[i]);
    }
    int cn = 1;
    for (auto u : s) id[cn] = u, cn++;
    cn--;
    for (int i = 1; i <= n; i++) {
        int l = 1, r = cn;
        while (l < r) {
            int m = (l + r) / 2;
            if (id[m] < a[i]) l = m + 1;
            else r = m;
        }
        a[i] = l;
        int val = get1(1, 1, l - 1, 1, cn) + 1;
        pq[l].push({val, i});
        update1(1, 1, cn, l);
    }
    for (int i = n; i >= 1; i--) {
        update2(1, 1, cn, a[i], i);
        int l = 0, r = cn;
        while (l < r) {
            int m = (l + r + 1) / 2;
            if (id[m] < id[a[i]] + x) l = m;
            else r = m - 1;
        }
        int tmp = get2(1, a[i] + 1, cn, 1, cn) + 1;
        ans = max(ans, get1(1, 1, l, 1, cn) + tmp);
        update3(1, 1, cn, a[i], tmp);
    }
    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...