This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |