Submission #714834

#TimeUsernameProblemLanguageResultExecution timeMemory
714834thimote75Global Warming (CEOI18_glo)C++14
100 / 100
418 ms14672 KiB

#include <bits/stdc++.h>

using namespace std;

#define num long long

// LIS maintainer
struct LISm {
    map<num, num> d;

    void insert (num id, num res) {
        if (query(id) >= res) return ;
        if (d.find(id) != d.end())
            d.erase(id);

        d.insert({ id, res });

        auto it = d.find(id);
        while (true) {
            it ++;
            if (it == d.end()) break ;
            if ((*it).second > res) break ;

            d.erase((*it).first);
            it = d.find(id);
        }
    }

    // returns the second value of the last iterator such that key < x
    num query (num x) {
        if (d.empty()) return 0;

        auto it = d.lower_bound(x); // first iterator such that key >= x
        if (it == d.begin()) return 0;
        it --; // last iterator such that key < x

        return (*it).second;
    }
    void show () {
        for (auto u : d)
            printf("%lld->%lld ", u.first, u.second);
        printf("\n");
    }
};

int main () {
    LISm lis_0;
    LISm lis_x;

    int nbTemp; num maxDelta;
    cin >> nbTemp >> maxDelta;

    num result = 0;

    for (int idTemp = 0; idTemp < nbTemp; idTemp ++) {
        num temp;
        cin >> temp;
        num temp_x = temp + maxDelta;

        num lis_0_value = 1 + lis_0.query(temp);
        num lis_x_value = 1 + max( lis_0.query(temp_x), lis_x.query(temp_x) );

        //printf("\n--- %d %lld ---\n", idTemp, temp);
        //printf("%d: 0(%lld) +x(%lld)\n", idTemp, lis_0_value, lis_x_value);

        lis_0.insert( temp,   lis_0_value );
        //lis_0.show();
        lis_x.insert( temp_x, lis_x_value );
        //lis_x.show();
    
        result = max(result, lis_0_value);
        result = max(result, lis_x_value);
    }

    cout << result;
}
#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...