题意:长度为n的序列a,box的数量无限个,每个box要么是空的要么至少装k个.
同一个box中,任意两个数a[j]-a[i]<=d. n,k<=5e5.a[i],d<=1e9. 问是否能将n个数字装到box中.
排序后xjb贪心 各种wa....
因为每个box装的都是连续的某段数(显然更优).
设dp[i]为前i个数是否有解,按照最后一段的长度来转移.
同一个box中,任意两个数a[j]-a[i]<=d. n,k<=5e5.a[i],d<=1e9. 问是否能将n个数字装到box中.
排序后xjb贪心 各种wa....
因为每个box装的都是连续的某段数(显然更优).
设dp[i]为前i个数是否有解,按照最后一段的长度来转移.
因为最后一段长度至少为k 并且 a[i]-a[le+1]<=d 判断dp[le:i-k]是否有true即可.
#include <bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,k,d,a[N],p[N];
bool dp[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie();
memset(dp,false,sizeof(dp));
cin>>n>>k>>d;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+1+n);
int le=0;
dp[0]=p[0]=true;
for(int i=1;i<=n;i++)
{
while(le<=i-k&&a[i]-a[le+1]>d)
le++;
if(i-k>=0&&le<=i-k&&p[i-k]-p[le-1]>=1)
dp[i]=true;
p[i]=p[i-1]+dp[i];
}
puts(dp[n]?"YES":"NO");
return 0;
}