Submission #895260

#TimeUsernameProblemLanguageResultExecution timeMemory
895260TheSahibGlobal Warming (CEOI18_glo)C++17
100 / 100
354 ms35412 KiB
#include <bits/stdc++.h>

#define ll long long
#define oo 1e9
#define pii pair<int, int>

using namespace std;

const int MAX = 2e5 + 5, treesize = MAX * 21, CAP = 1e9 + 9;

int n, x;
int arr[MAX];
int tree[treesize], L[treesize], R[treesize];
int LIS[MAX];

int nxt = 2;

void update(int node, int l, int r, int pos, int val){
    if(l == r){
        tree[node] = max(val, tree[node]);
        return;
    }
    int mid = (l + r) / 2;
    if(pos <= mid){
        if(!L[node]) L[node] = nxt++;
        update(L[node], l, mid, pos, val);
    }
    else{
        if(!R[node]) R[node] = nxt++;
        update(R[node], mid + 1, r, pos, val);
    }
    tree[node] = max(tree[L[node]], tree[R[node]]);
}

int ask(int node, int l, int r, int ql, int qr){
    if(!node) return 0;
    if(qr < l || r < ql) return 0;
    if(ql <= l && r <= qr) return tree[node];
    int mid = (l + r) / 2;
    return max(ask(L[node], l, mid, ql, qr), ask(R[node], mid + 1, r, ql, qr));
}

void solve(){
    cin >> n >> x;
    for(int i = 1; i <= n; i++){
        cin >> arr[i];
    }
    vector<int> v;
    for(int i = 1; i <= n; i++){
        int pos = lower_bound(v.begin(), v.end(), arr[i]) - v.begin();
        LIS[i] = pos + 1;
        if(pos == v.size()){
            v.push_back(arr[i]);
        }
        else{
            v[pos] = arr[i];
        }
    }
    int ans = 0;
    for(int i = n; i >= 1; i--){
        ans = max(ans, LIS[i] + ask(1, 1, CAP, max(arr[i] - x + 1, 1), arr[i] + x - 1));
        update(1, 1, CAP, arr[i], ask(1, 1, CAP, arr[i] + 1, CAP) + 1);
    }
    cout << ans << '\n';
}

int main()
{
    int t = 1;
    while(t){
        t--;
        solve();
    }
}

Compilation message (stderr)

glo.cpp: In function 'void solve()':
glo.cpp:52:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   52 |         if(pos == v.size()){
      |            ~~~~^~~~~~~~~~~
#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...