#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
typedef pair<int,int>i2;
int k,c,d,x,y,z,n,ans;
int i,j;
int st[4*N],g[N],h[N],f[N],b[N];
struct gv
{
int val,vitri;
};
gv a[N];
bool cmp(gv x,gv y)
{
if (x.val<y.val) return true;
if (x.val==y.val && x.vitri>y.vitri) return true;
return false;
}
bool cmp1(gv x,gv y)
{
if (x.val>y.val) return true;
if (x.val==y.val && x.vitri<y.vitri) return true;
return false;
}
void update(int id,int l,int r,int i,int val)
{
if (i<l || r<i) return;
if (l==r)
{
st[id]=val;
return;
}
int mid=(l+r)/2;
update(id*2,l,mid,i,val);
update(id*2+1,mid+1,r,i,val);
st[id]=max(st[id*2],st[id*2+1]);
}
int get(int id,int l,int r,int u,int v)
{
if (v<l || r<u) return 0;
if (u<=l && r<=v) return st[id];
int mid=(l+r)/2;
return max(get(id*2,l,mid,u,v),get(id*2+1,mid+1,r,u,v));
}
namespace sub2
{
void solve()
{
for (int i=1;i<=n;i++)
{
// cout<<g[i]<<" "<<h[i]<<"\n";
c=b[i];
for (int j=i+1;j<=n;j++)
{
d=b[j]+k;
if (c<d) ans=max(ans,g[i]+h[j]);
}
}
for (int i=1;i<=n;i++)
{
d=b[i];
for (int j=1;j<i;j++)
{
c=b[j]-k;
if (c<d) ans=max(ans,g[j]+h[i]);
}
}
cout<<ans;
}
}
namespace sub3
{
vector<int>tt;
map<int,int>mp;
int id;
int st[8*N];
void nen()
{
sort(tt.begin(),tt.end());
id++; mp[tt[0]]=id;
for (int i=1;i<tt.size();i++)
if (tt[i]!=tt[i-1])
{
id++; mp[tt[i]]=id;
}
}
void update(int id,int l,int r,int i,int val)
{
if (i<l || r<i) return;
if (l==r)
{
st[id]=val;
return;
}
int mid=(l+r)/2;
update(id*2,l,mid,i,val);
update(id*2+1,mid+1,r,i,val);
st[id]=max(st[id*2],st[id*2+1]);
}
int get(int id,int l,int r,int u,int v)
{
if (v<l || r<u) return 0;
if (u<=l && r<=v) return st[id];
int mid=(l+r)/2;
return max(get(id*2,l,mid,u,v),get(id*2+1,mid+1,r,u,v));
}
void solve()
{
for (int i=1;i<=4*n;i++)
st[i]=0;
for (int i=1;i<=n;i++)
{
tt.push_back(b[i]+k);
tt.push_back(b[i]+1);
}
nen();
for (int i=n;i>=1;i--)
{
c=get(1,1,id,mp[b[i]+1],id);
// cout<<g[i]<<" "<<c<<" "<<b[i]+k<<"\n";
ans=max(ans,g[i]+c);
update(1,1,id,mp[b[i]+k],h[i]);
}
cout<<ans;
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>n>>k;
for (int i=1;i<=n;i++)
{
cin>>a[i].val; a[i].vitri=i;
b[i]=a[i].val;
}
sort(a+1,a+n+1,cmp);
for (int i=1;i<=n;i++)
{
z=a[i].vitri;
c=get(1,1,n,1,z);
g[z]=c+1;
ans=max(ans,g[z]);
update(1,1,n,z,g[z]);
}
// cout<<n<<"\n";
for (int i=1;i<=4*n;i++)
st[i]=0;
// cout<<n<<"\n";
sort(a+1,a+n+1,cmp1);
// cout<<n<<"\n";
for (int i=1;i<=n;i++)
{
z=a[i].vitri;
c=get(1,1,n,z,n);
h[z]=c+1;
update(1,1,n,z,h[z]);
}
// cout<<n<<"\n";
for (int i=n;i>=1;i--)
{
f[i]=max(f[i+1],b[i]);
}
if (n<=1000) sub2::solve(); else
sub3::solve();
}
# | 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... |