#include <bits/stdc++.h>
using namespace std;
signed main()
{
int n,R;
cin>>n>>R;
int a[n];
unordered_set<int> se;
se.insert(0);
for (int i=0;i<n;i++)
{
cin>>a[i];
vector<int> v;
for (int j:se)
v.push_back(j+R);
for (int j:v)
se.insert(j);
se.insert(a[i]),se.insert(a[i]-R);
}
vector<int> v;
for (int i:se)
v.push_back(i);
sort(v.begin(),v.end());
int m=v.size();
int dp[2][m],l[m];
for (int i=0;i<m;i++)
for (int j=i;j>=0;j--)
if (v[i]-v[j]<=R)
l[i]=j;
int x=lower_bound(v.begin(),v.end(),R)-begin(v),y=lower_bound(v.begin(),v.end(),a[0])-begin(v);
for (int i=0;i<m;i++)
dp[0][i]=n+1;
dp[0][x]=1;
if (a[0]<=R)
dp[0][y]=0;
for (int i=1;i<n;i++)
{
int suf[m];suf[m-1]=dp[1-i%2][m-1];
for (int j=m-2;j>=0;j--)
suf[j]=min(suf[j+1],dp[1-i%2][j]);
for (int j=0;j<m;j++)
dp[i%2][j]=suf[l[j]]+(a[i]!=v[j]);
} int ans=dp[1-n%2][0];
for (int i=1;i<m;i++)
ans=min(ans,dp[1-n%2][i]);
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... |