Submission #1129643

#TimeUsernameProblemLanguageResultExecution timeMemory
1129643alecurseGlobal Warming (CEOI18_glo)C++20
100 / 100
303 ms7176 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <assert.h>
using namespace std;
int reals=1;
vector<int> tree;

void add(int k, int x, int y, int l, int r, int val) {
    if(y<=l||x>=r) return;
    if(x>=l&&y<=r) {
        tree[k]=val;
        return;
    }
    int d = (x+y)/2;
    add(k*2,x,d,l,r,val);
    add(k*2+1,d,y,l,r,val);
    tree[k]=max(tree[k*2],tree[k*2+1]);
}

int getmax(int k, int x, int y, int l, int r) {
    if(y<=l||x>=r) return 0; 
    if(x>=l&&y<=r) {
        return tree[k];
    }
    int d = (x+y)/2;
    return max(getmax(k*2,x,d,l,r),getmax(k*2+1,d,y,l,r));
}
bool comp(pair<int,int> &a, pair<int,int> &b) {
    if(a.first==b.first) {
        return a.second>b.second;
    }
    return a.first<b.first;
}

int bsearch(int x, vector<pair<int,int> > &v, int N) {
    int a = 0, b=N-1;
    int minimo=N;
    while(a<=b) {
        int k = (a+b)/2;
        if(v[k].first>x) {
            minimo = min(minimo,k);
            b=k-1;
        } else {
            a=k+1;
        }
    }
    return minimo;
}
int main() {
    // freopen("input.txt","r",stdin);
    // freopen("output.txt","w",stdout);
    int N,X;
    cin>>N>>X;
    // assert(X==0);
    vector<int> dp(N);
    vector<int> v(N);
    vector<pair<int,int> > vtosort(N);
    for(int i=0;i<N;i++) {
        cin>>v[i];
        vtosort[i].first=v[i];
        vtosort[i].second=i;
    }
    sort(vtosort.begin(),vtosort.end(),comp);
    vector<int> indexes(N);
    for(int i=0;i<N;i++) {
        indexes[vtosort[i].second]=i;
    }
    while(reals<=N)
        reals*=2;
    tree.resize(reals*2);
    for(int i=0;i<N;i++) {
        int maxbef = getmax(1,0,reals,0,indexes[i]);
        dp[i]=maxbef+1;
        add(1,0,reals,indexes[i],indexes[i]+1,dp[i]);
    }
    int maxres=0;
    for(int i=0;i<N;i++) {
        maxres=max(maxres,dp[i]);
    }
    tree.clear();
    tree.resize(reals*2);
    vector<int> newdp(N);
    for(int i=N-1;i>0;i--) {
        int maxbef = getmax(1,0,reals,indexes[i],reals);
        newdp[i]=maxbef+1;
        add(1,0,reals,indexes[i],indexes[i]+1,newdp[i]);
        int indextree = bsearch(v[i-1]-X,vtosort,N);
        // cout<<v[i-1]-X<<" "<<indextree<<"\n";
        int thsol = dp[i-1]+getmax(1,0,reals,indextree,reals);
        // cout<<indextree<<" "<<v[i-1]<<"\n";
        maxres=max(maxres,thsol);
    }
    cout<<maxres;

}
#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...