提交时间:2024-08-30 14:48:08
运行 ID: 32041
#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define fr first #define sc second int read(){int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}x=c-'0';c=getchar();while(c<='9'&&c>='0'){x*=10;x+=c-'0';c=getchar();}return x*f;} const int MAXN=100010,N=110,inf=1000000000; int n,m,c,f[MAXN][N],f2[N][MAXN*10],a[MAXN],ans; void slv(){ n=read(),c=read(); for(int i=1;i<=n;i++)a[i]=read(),m=max(m,a[i]); if(m<=100){ for(int i=1;i<=n;i++){ int cnt=inf; for(int j=1;j<=m;j++){ cnt=min(f[i-1][j]-j*c,cnt); if(j>=a[i])f[i][j]=cnt+j*c+(j-a[i])*(j-a[i]); else f[i][j]=inf; } cnt=inf; for(int j=m;j>=a[i];j--){ cnt=min(cnt,f[i-1][j]+j*c); if(j>=a[i])f[i][j]=min(f[i][j],cnt-j*c+(j-a[i])*(j-a[i])); } } ans=inf; for(int i=a[n];i<=m;i++)ans=min(ans,f[n][i]); } else{ for(int i=1;i<=n;i++){ int cnt=inf; for(int j=1;j<=m;j++){ cnt=min(f2[i-1][j]-j*c,cnt); if(j>=a[i])f2[i][j]=cnt+j*c+(j-a[i])*(j-a[i]); else f2[i][j]=inf; } cnt=inf; for(int j=m;j>=a[i];j--){ cnt=min(cnt,f2[i-1][j]+j*c); if(j>=a[i])f2[i][j]=min(f2[i][j],cnt-j*c+(j-a[i])*(j-a[i])); } } ans=inf; for(int i=a[n];i<=m;i++)ans=min(ans,f2[n][i]); } printf("%lld",ans); } signed main(){ slv(); return 0; }