树状数组优化dp问题
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int n,k,d;
int b[N];
int a[N];
int f[N];
int lowbit(int x){
return x&-x;
}
void update(int x,int v){
while(x<=n){
b[x]+=v;
x+=lowbit(x);
}
}
int query(int x){
int ans=0;
while(x){
ans+=b[x];
x-=lowbit(x);
}
return ans;
}
int main(){
scanf("%d%d%d",&n,&k,&d);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
if(i<k) f[i]=0;
else if(a[i]-a[1]<=d) f[i]=1;
else{
int t=lower_bound(a+1,a+1+n,a[i]-d)-a-1;
if(query(i-k)-query(t-1)>0) f[i]=1;
}
if(f[i]) update(i,1);
}
if(f[n]) puts("YES");
else puts("NO");
return 0;
}