#include<bits/stdc++.h>
using namespace std;
const int MAXN=3e5+5;
int seg[MAXN*4],A[MAXN],pos[MAXN];
set<int> st;
bool comp(int a,int b)
{
if(A[a]==A[b]) return a>b;
return A[a]<A[b];
}
void update(int l,int r,int i,int val,int pos)
{
if(i<l||r<i) return ;
if(l==r)
{
seg[pos]=val;
return ;
}
int mid=(l+r)/2;
update(l,mid,i,val,pos*2);
update(mid+1,r,i,val,pos*2+1);
seg[pos]=max(seg[pos*2],seg[pos*2+1]);
}
int get(int l,int r,int u,int v,int pos)
{
if(u>v) return 0;
if(u<=l&&r<=v) return seg[pos];
int mid=(l+r)/2;
if(v<=mid) return get(l,mid,u,v,pos*2);
if(mid+1<=u) return get(mid+1,r,u,v,pos*2+1);
return max(get(l,mid,u,v,pos*2),get(mid+1,r,u,v,pos*2+1));
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,d;
cin>>n>>d;
for(int i=d;i<=n;i++) st.insert(i);
for(int i=1;i<=n;i++)
{
cin>>A[i];
pos[i]=i;
}
sort(pos+1,pos+n+1,comp);
st.insert(0),st.insert(n+d+67);
for(int i=1;i<=n;i++)
{
int p=pos[i];
update(1,n,p,get(1,n,*prev(st.lower_bound(p))+1,p-1,1)+1,1);
while((*st.lower_bound(p))<=p+d-1) st.erase(st.lower_bound(p));
}
cout<<seg[1];
}
| # | 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... |