#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int MAXN=3e5+5;
int n,d;
int a[MAXN];
set<int> s;
map<int,int> code;
priority_queue<pair<int,int> > dp[7005];
void compress()
{
for(int i=1;i<=n;i++) s.insert(a[i]);
int i=1;
for(auto x: s)
{
code[x]=i;
i++;
}
for(int i=1;i<=n;i++) a[i]=code[a[i]];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>n>>d;
for(int i=1;i<=n;i++) cin>>a[i];
compress();
//for(int i=0;i<=n;i++) dp[i].push({0,})
for(int i=1;i<=n;i++)
{
int bst=1;
for(int j=1;j<a[i];j++)
{
while((!dp[j].empty()) && dp[j].top().second<i-d) dp[j].pop();
if(!dp[j].empty()) bst=max(bst, dp[j].top().first+1);
}
while((!dp[a[i]].empty()) && dp[a[i]].top().second<i-d) dp[a[i]].pop();
if(!dp[a[i]].empty()) bst=max(bst, dp[a[i]].top().first);
dp[a[i]].push({bst,i});
for(int j=a[i]+1;j<=n;j++)
{
while((!dp[j].empty()) && dp[j].top().second<i-d) dp[j].pop();
if(!dp[j].empty()) dp[j].push({dp[j].top().first, i});
}
}
int ans=0;
for(int i=1;i<=n;i++)
{
while(!dp[i].empty())
{
if(dp[i].top().second==n) ans=max(ans, dp[i].top().first);
dp[i].pop();
}
}
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... |