제출 #161210

#제출 시각아이디문제언어결과실행 시간메모리
161210rama_pangGlobal Warming (CEOI18_glo)C++14
42 / 100
73 ms11344 KiB
#include <bits/stdc++.h>
using namespace std;
using lint = long long;
const lint INF = 1e15;

lint N, X;
lint A[200005];
lint lis[200005];
lint lds[200005];
pair<lint, lint> anslis[200005];
pair<lint, lint> anslds[200005];


lint LIS() {
    for (int i = 0; i <= N; i++) lis[i] = INF, lds[i] = -INF;
    lis[0] = -INF, lds[N] = INF;

    lint res = 0;

    for (lint i = 0, cur = 0; i < N; i++) {
        lint j = upper_bound(lis, lis + N + 1, A[i] - X) - lis;
        if (lis[j - 1] < A[i] - X && A[i] - X < lis[j]) lis[j] = A[i] - X, cur = max(cur, j);
        anslis[i] = {j, lis[j]};
    }

    for (lint i = N - 1, cur = N - 1; i >= 0; i--) {
        lint j = lower_bound(lds, lds + N + 1, A[i]) - lds;
        if (j >= 1 && lds[j - 1] < A[i] && A[i] < lds[j]) lds[j - 1] = A[i], cur = min(cur, j - 1);
        
        anslds[i] = {cur, lds[cur]};
    }

    for (lint i = 0; i <= N; i++) {
        if (lis[i] < INF) res = max(res, i);
    }

    for (lint i = 0; i + 1 < N; i++) {
        if (anslis[i].second < anslds[i + 1].second) 
            res = max(res, anslis[i].first + N - anslds[i + 1].first);
    }

    return res;
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> N >> X;
    for (int i = 0; i < N; i++) cin >> A[i];

    lint ans = LIS();
    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...