#include "bits/stdc++.h"
#define F first
#define S second
#define ll long long
#define pii pair<int,int>
const int mxN = 3e5 + 5;
const int mod = 1e9 + 7;
using namespace std;
int dp[mxN];
pii a[mxN];
int n,d;
set<pii>s;
int seg[mxN];
int N;
int query(int l,int r,int ind,int s,int e){
if(l > e || r < s) return 0;
if(l >= s && r <= e) return seg[ind];
int md = (l + r) / 2;
return max(query(l,md,ind * 2,s,e),query(md + 1,r,ind * 2 + 1,s,e));
}
void update(int ind,int val){
ind += N;
seg[ind] = val;
for(ind /= 2;ind;ind /= 2) seg[ind] = max(seg[ind * 2],seg[ind * 2 + 1]);
}
signed main(){
int ans = 0;
cin >>n>>d;
N = exp2(ceil(log2(n)));
for(int i = 1;i <= n;i++) {
cin >>a[i].F;
a[i].S = i;
}
sort(a + 1,a + n + 1);
s.insert({1,n});
int prev = -1;
queue<pii>buff;
for(int i = 1;i <= n;i++){
if(a[i].F != prev){
prev = a[i].F;
while(buff.size()){
auto u = buff.front();
buff.pop();
update(u.F,u.S);
}
}
int l = 1,r = a[i].S - 1;
if(s.size()){
auto x = s.upper_bound({a[i].S,1e9});
if(x != s.begin()){
x--;
if(x->F <= a[i].S && x->S >= a[i].S){
pii y = {x->F,a[i].S - 1},z = {a[i].S + 1,x->S};
s.erase(x);
if(y.S - y.F + 1 >= d) s.insert(y);
if(z.S - z.F + 1 >= d) s.insert(z);
}
}
if(s.size()){
x = s.upper_bound({a[i].S,0});
if(x != s.begin()){
x--;
l = x->S + 1;
}
}
}
dp[a[i].S] = query(1,N,1,l,r) + 1;
// cout<<l<<' '<<r<<'\n';
// cout<<a[i].F<<' '<<a[i].S<<' '<<dp[a[i].S]<<'\n';
ans = max(ans,dp[a[i].S]);
buff.push({a[i].S - 1,dp[a[i].S]});
}
cout<<ans;
}
# | 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... |