Submission #70179

#TimeUsernameProblemLanguageResultExecution timeMemory
70179model_codeGlobal Warming (CEOI18_glo)C++17
100 / 100
106 ms2668 KiB
// Patryk Czajka

#include <cstdio>
#include <cassert>

inline int max(int a, int b) {
    return a > b ? a : b;
}

int n, X, res;
const int maxN = 2e5 + 10;

int t[maxN];
int dp[maxN];
int res_part[maxN];
int dp_i;

void reset() {
    dp_i = 0;
}

int add(int x) {
    int a = -1, b = dp_i, avg;
    while(b - a > 1) {
        avg = (a + b) / 2;
        if(dp[avg] < x) a = avg;
        else b = avg;
    }
    dp[b] = x;
    dp_i = max(dp_i, b + 1);
    return b + 1;
}


void check(int i) {
    int a = -1, b = dp_i, avg;
    while(b - a > 1) {
        avg = (a + b) / 2;
        if(dp[avg] < X - t[i]) a = avg;
        else b = avg;
    }
    res = max(res_part[i] + b, res);
}


int main() {
    int ans;
    ans = scanf("%d%d", &n, &X);
    assert(ans >= 0);
    for(int i = 0; i < n; ++i) {
        ans = scanf("%d", t + i);
        assert(ans >= 0);
        res_part[i] = add(t[i]);
    }

    reset();
    for(int i = n - 1; i >= 0; --i) {
        check(i);
        add(-t[i]);
    }
    printf("%d\n", res);
}
#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...