#include #include #define N 500010 #define db double #define ll long long using namespace std; int n,m,g[N],l,len; ll a[N],sum[N],f[N];

inline int read() { int x=0; char c=getchar(); while (c<'0' || c>'9') c=getchar(); while (c>='0' && c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x; }

ll sqr(ll x) {return x*x;}

ll solve(int x,int y) {return (db)(f[x]+sqr(sum[x])-f[y]-sqr(sum[y]))/(sum[x]-sum[y]);}

int main() { freopen("#10191.in","r",stdin); freopen("#10191.out","w",stdout); // f[i]=min{f[j]+(sum[i]-sum[j])^2+a[i]^2}; while (scanf("%d%d",&n,&m)==2) { for (int i=1;i<=n;i++) a[i]=read(),sum[i]=sum[i-1]+a[i]; l=len=0; for (int i=1;i<=n;i++) { while (l<len && solve(g[l+1],g[l])<2*sum[i]) l++; f[i]=f[g[l]]+sqr(sum[i]-sum[g[l]])+m; while (l<len && solve(g[len],g[len-1])>solve(i,g[len])) len--; g[++len]=i; } printf("%lld\n",f[n]); } return 0; }

1 comments

  • 1

Information

ID
1214
Time
1000ms
Memory
256MiB
Difficulty
10
Tags
# Submissions
2
Accepted
0
Uploaded By