Submission #1050386

#TimeUsernameProblemLanguageResultExecution timeMemory
1050386antonGlobal Warming (CEOI18_glo)C++17
100 / 100
182 ms26080 KiB
#include<bits/stdc++.h>

using namespace std;
#define int long long
#define pii pair<int, int>
int N, X;


struct MaxTree{
    int len = 1;
    vector<int> tr;
    MaxTree(int n){
        while(len<n){
            len*=2;
        }
        tr.resize(2*len);
    }

    void upd(int u){
        for(u/=2; u>=1; u/=2){
            tr[u] = max(tr[u*2], tr[u*2+1]);
        }
    }

    int get(int l, int r){
        l += len;
        r+=len+1;
        int res = 0;
        for(; l<r; l/=2, r/=2){
            if(l%2 ==1){
                res = max(res, tr[l++]);
            }
            if(r%2 == 1){
                res = max(res, tr[--r]);
            }
        }
        return res;
    }

    void set(int pos, int val){
        pos+=len;
        tr[pos] = max(tr[pos], val);
        upd(pos);
    }
};

int find_pos(int e, vector<int>& v){

    int pos =0;
    for(int step = (1LL<<20); step>=1; step/=2){
        if(pos+step<v.size() && v[pos+step]<=e){
            pos+=step;
        }
    }
    return pos;
}

vector<int> vals;

int lis(vector<pii>& v){
    MaxTree low(vals.size());
    MaxTree high(vals.size());

    for(int i= 0; i<N; i++){
        int best_high = max(high.get(0, v[i].first-1), low.get(0, v[i].second-1));
        high.set(v[i].first, best_high+1);
        int best_low = low.get(0, v[i].first-1);
        low.set(v[i].first, best_low+1);
    }

    return high.get(0, vals.size()-1);
}
signed main(){
    cin>>N>>X;
    vector<pii> t(N);
    vals.push_back(0);
    for(int i = 0; i<N; i++){
        cin>>t[i].first;
        vals.push_back(t[i].first);
        vals.push_back(t[i].first+X);
    }


    sort(vals.begin(), vals.end());

    for(int i = 0; i<N; i++){
        t[i] ={find_pos(t[i].first, vals), find_pos(t[i].first+X, vals)};
    }
    
    cout<<lis(t)<<endl;
    
}

Compilation message (stderr)

glo.cpp: In function 'long long int find_pos(long long int, std::vector<long long int>&)':
glo.cpp:51:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   51 |         if(pos+step<v.size() && v[pos+step]<=e){
      |            ~~~~~~~~^~~~~~~~~
#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...