救救孩子吧,拍一个下午了QAQ
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=50050;
int l,r;
ll c[N],f[N],q[N];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%lld",&c[i]);
c[i]+=c[i-1];
}
l=r=1;
q[0]=c[0]=f[0]=0;
for(int i=1;i<=n;i++){
ll p=i+c[i];
while(l<r){
ll x1=q[l]+c[q[l]]+1+k,x2=q[l+1]+c[q[l+1]]+1+k;
if(f[q[l+1]]+x2*x2-f[q[l]]-x1*x1<=p*(x2-x1))l++;
else break;
}
f[i]=f[q[l]]+1ll*(p-q[l]-c[q[l]]-1-k)*(p-q[l]-c[q[l]]-1-k);
ll x=i+c[i]+1+k;
while(l<r){
ll x1=q[r-1]+c[q[r-1]]+1+k,x2=q[r]+c[q[r]]+1+k;
if(f[i]+x*x+f[q[r-1]]+x1*x1<=2*(f[q[r]]+x2*x2))r--;
else break;
}
r++;
q[r]=i;
}
printf("%lld",f[n]);
return 0;
}