#include <bits/stdc++.h>
#define endl "\n"
#define mod 1000000007
using namespace std;
int n,d,arr[300010];
int bigL[300010],bigR[300010],dp[300010];
vector <int> query[300010],del[300010],ins[300010];
void compress(){
set <int> comp;
map <int,int> key;
for(int i=1;i<=n;i++){
comp.insert(arr[i]);
}
int cnt=0;
for(int i:comp){
key[i]=++cnt;
}
for(int i=1;i<=n;i++) arr[i]=key[arr[i]];
return;
}
void stack_trick(){
vector <int> qu;
for(int i=1;i<=n;i++){
while(!qu.empty()&&arr[qu.back()]<=arr[i]){ qu.pop_back();}
if(qu.size()==0) bigL[i]=0;
else bigL[i]=qu.back();
qu.push_back(i);
}
qu.clear();
for(int i=n;i>=1;i--){
while(!qu.empty()&&arr[qu.back()]<=arr[i]){ qu.pop_back();}
if(qu.size()==0) bigR[i]=n+1;
else bigR[i]=qu.back();
qu.push_back(i);
}
qu.clear();
}
const int N=(1<<19);
int Tree[N*2+5][2];
multiset <int> lf[300010];
void update1(int i){
i+=N;
Tree[i][0]=*lf[i-N].rbegin();
i/=2;
while(i!=0){
Tree[i][0]=max(Tree[i*2][0],Tree[i*2+1][0]);
i/=2;
}
return;
}
void update2(int i,int val){
i+=N;
Tree[i][1]=val;
i/=2;
while(i!=0){
Tree[i][1]=max(Tree[i*2][1],Tree[i*2+1][1]);
i/=2;
}
return;
}
int solve(int l1,int r1,int i,int l,int r,int u){
if(l1>r||l>r1) return 0;
if(l<=l1&&r1<=r) return Tree[i][u];
return max(solve(l1,(l1+r1)/2,i*2,l,r,u),solve((l1+r1)/2+1,r1,i*2+1,l,r,u));
}
void slv(){
int ans=0;
for(int i=1;i<=n;i++){
dp[i]=1;
int cnt=0;
for(int j=i-1;j>=1;j--){
if(arr[j]>arr[i]){
cnt++;
if(cnt+1>d) break;
}
else cnt=0;
if(arr[i]<=arr[j]) continue;
dp[i]=max(dp[i],dp[j]+1);
}
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
exit(0);
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>n>>d;
for(int i=1;i<=n;i++) cin>>arr[i];
if(n<=5000) slv();
compress();
stack_trick();
for(int i=1;i<=n;i++){
lf[arr[i]].insert(0);
lf[i].insert(0);
query[bigL[i]].push_back(i);
ins[bigR[i]].push_back(i);
del[min(n+1,bigR[i]+d-1)].push_back(i);
}
int mx=0;
for(int i=1;i<=n;i++){
for(int j:ins[i]){
update2(j,dp[j]);
}
lf[arr[i]].erase(lf[arr[i]].find(dp[i]));
dp[i]=max(dp[i],solve(0,N-1,1,bigL[i]+1,i-1,1)+1);
lf[arr[i]].insert(dp[i]);
update1(arr[i]);
for(int j:del[i]){
lf[arr[j]].erase(lf[arr[j]].find(dp[j]));
update1(arr[j]);
}
for(int j:query[i]){
lf[arr[j]].erase(lf[arr[j]].find(dp[j]));
dp[j]=solve(0,N-1,1,0,arr[j]-1,0)+1;
lf[arr[j]].insert(dp[j]);
}
mx=max(mx,dp[i]);
}
cout<<mx<<endl;
}
# | 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... |