제출 #1222101

#제출 시각아이디문제언어결과실행 시간메모리
1222101LaMatematica14Global Warming (CEOI18_glo)C++20
100 / 100
261 ms15408 KiB
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1<<18;
vector<int> seg(maxn<<1, 0);

int q(int a, int l, int r, int lq, int rq) {
    if (l >= lq && r <= rq) return seg[a];
    int mid = (l+r)/2;
    int x = 0;
    if (mid > lq) x = q(a<<1, l, mid, lq, rq);
    if (mid < rq) x = max(x, q(a<<1|1, mid, r, lq, rq));
    return x;
}

void upd(int a, int v) {
    for (a+=maxn; a > 0; a>>=1) seg[a] = max(seg[a], v);
}

int main() {
    int N, X; cin >> N >> X;
    vector<int> T(N);
    for (int i = 0; i < N; i++) cin >> T[i];

    vector<int> comp = T;
    sort(comp.begin(), comp.end());
    comp.erase(unique(comp.begin(), comp.end()), comp.end());
    unordered_map<int, int> end;
    for (int i = 0; i < N; i++) end.insert({comp[i], i});


    // Right way LIS
    vector<int> pref(N);
    for (int i = 0; i < N; i++) {
        pref[i] = q(1, 0, maxn, 0, end[T[i]])+1;
        upd(end[T[i]], pref[i]);
    }

    // inverse LDS
    vector<int> S = T;
    reverse(S.begin(), S.end()); reverse(pref.begin(), pref.end());
    vector<int> dp(N+1, -1);
    int l = 1; dp[1] = 0;
    for (int i = 1; i < N; i++) {
        int fake = S[i]-X;
        if (S[dp[l]] > fake) pref[i] += l;
        else if (S[dp[1]] > fake) {
            int ll = 1, rr = N;
            while (ll  < rr-1) {
                int mid = (ll+rr)/2;
                if (S[dp[mid]] <= fake) rr = mid;
                else ll = mid;
            }
            pref[i] += ll;
        }

        if (S[dp[l]] > S[i]) dp[++l] = i;
        else if (S[dp[1]] <= S[i]) dp[1] = i;
        else {
            int ll = 1, rr = N;
            while (ll  < rr-1) {
                int mid = (ll+rr)/2;
                if (S[dp[mid]] <= S[i]) rr = mid;
                else ll = mid;
            }
            dp[rr] = i;
        }
    }
    int m = 0;
    for (int i = 0; i < N; i++) m = max(m, pref[i]);
    cout << m << '\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...