——————————————————————————————————————————————————-
想不到普及组的题都会这么有意思
数轴上转移,借鉴了@Sooke的剪枝思想,虽然就剪一个就A了
斜率优化在考虑中
——————————————————————————————————————
#include<bits/stdc++.h> using namespace std; int n,m,tt,a; int cnt[4000100],sum[4000100],f[4000100]; int main() { cin>>n>>m; for(int i=1;i<=n;i++){cin>>a;tt=max(tt,a);cnt[a]++;sum[a]+=a;} for(int i=1;i<=tt+m;i++)cnt[i]+=cnt[i-1],sum[i]+=sum[i-1]; for(int i=0;i<=tt+m;i++) { f[i]=cnt[i]*i-sum[i]; for(int j=max(0,i-2*m+1);j<=i-m;j++) f[i]=min(f[i],f[j]+(cnt[i]-cnt[j])*i-sum[i]+sum[j]); } int ans=0x3f3f3f3f; for(int i=tt;i<=tt+m;i++)ans=min(f[i],ans); cout<<ans; }