Submission #1178793

#TimeUsernameProblemLanguageResultExecution timeMemory
1178793petezaGlobal Warming (CEOI18_glo)C++20
10 / 100
40 ms4936 KiB
#include <bits/stdc++.h>
using namespace std;

int n, x;
int fwk[200005];
int froml[200005], fromr[200005];

void upd(int x, int val) {
    //cout << x << ' ' << val << '\n';
    for(;x<=200000;x+=x&-x)
        fwk[x] = max(fwk[x], val);
}

int qr(int x) {
    int mx = INT_MIN;
    for(;x;x-=x&-x)
        mx = max(mx, fwk[x]);
    return mx;
}

int main() {
    cin.tie(0) -> sync_with_stdio(0);
    cin >> n >> x;
    vector<int> vec(n);
    vector<pair<int, int>> pos(n);
    int i = 0;
    for(auto &e:vec) {
        cin >> e;
        pos[i] = {e, i+1}; i++;
    }
    sort(pos.begin(), pos.end(), [](pair<int, int> a, pair<int, int> b){
        if(a.first == b.first) return a.second > b.second;
        return a.first < b.first;
    });
    for(auto &e:pos) {
        froml[e.second] = qr(e.second) + 1;
        upd(e.second, froml[e.second]);
    } //calc from l
    memset(fwk, 0, sizeof fwk);
    reverse(pos.begin(), pos.end());
    for(auto &e:pos) {
        fromr[e.second] = qr(n-e.second+1) + 1;
        upd(n-e.second+1, fromr[e.second]);
    }
    //for(int i=1;i<=n;i++) cout << fromr[i] << ' ';
    int cans = *max_element(froml, froml+200005);
    if(x == 0) {cout << cans; return 0;}
    //vector<pair<int, int>> vec2;
    set<pair<int, int>> vec2;
    for(int i=n-1;i>=0;i--) {
        if(!vec2.empty()) {
            //auto it = upper_bound(vec2.begin(), vec2.end(), make_pair(vec[i]-x, INT_MAX));
            auto it = vec2.upper_bound(make_pair(vec[i] - x, INT_MIN));
            if(it != vec2.end())
                cans = max(cans, froml[i] + it->second);
        }
        auto toins = make_pair(vec[i], fromr[i]);
        if(vec2.empty() || (--vec2.end())->second <= fromr[i]) {
            while(!vec2.empty() && (--vec2.end())->first >= vec[i]) vec2.erase(--vec2.end());
            vec2.emplace(vec[i], fromr[i]);
        };
    }
    cout << cans;
}
#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...