Submission #1008029

#TimeUsernameProblemLanguageResultExecution timeMemory
1008029vjudge1Global Warming (CEOI18_glo)C++17
100 / 100
616 ms50296 KiB
#include <bits/stdc++.h>
#define maxn 500000
using namespace std;
int seg[4*maxn];
map<int,int> pos;
set<int> s;
int n,x;
int t[maxn];
void clear(int id,int l,int r) {
    seg[id]=0;
    if(l==r) return;
    int mid=(l+r)/2;
    clear(id*2+1,l,mid);
    clear(id*2+2,mid+1,r);
}
int query(int id,int l,int r,int x,int y) {
    if(x<=l && r<=y) return seg[id];
    if(y<l || r<x) return 0;
    int mid=(l+r)/2;
    return max(query(id*2+1,l,mid,x,y),query(id*2+2,mid+1,r,x,y));
}
void update(int id,int l,int r,int p,int v) {
    seg[id]=max(seg[id],v);
    if(l==r) return;
    int mid=(l+r)/2;
    if(p<=mid) update(id*2+1,l,mid,p,v);
    else update(id*2+2,mid+1,r,p,v);
}
int pref[maxn];
int suf[maxn];
int main() {
    ios::sync_with_stdio(false); cin.tie(0);
    cin>>n>>x;
    for(int i=1;i<=n;i++) {
        cin>>t[i];
        s.insert(t[i]);
        s.insert(t[i]-x);
    }
    int id=0;
    for(auto v:s) {
        pos[v]=id++;
    }
    clear(0,0,maxn);
    for(int i=1;i<=n;i++) {
        pref[i]=1+query(0,0,maxn,0,pos[t[i]]-1);
        update(0,0,maxn,pos[t[i]],pref[i]);
    }
    clear(0,0,maxn);
    for(int i=n;i>=1;i--) {
        suf[i]=1+query(0,0,maxn,pos[t[i]]+1,maxn);
        update(0,0,maxn,pos[t[i]],suf[i]);
    }
    clear(0,0,maxn);
    int ans=0;
    for(int i=1;i<=n;i++) {
        ans=max(ans,suf[i]+query(0,0,maxn,0,pos[t[i]]-1));
        update(0,0,maxn,pos[t[i]-x],pref[i]);
    }
    cout<<ans<<endl;
    return 0;
}
#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...