rt
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int main()
{
int n;
long long L;
scanf("%d%lld",&n,&L);
vector<long long>c(n+2,0);
for(int i=1;i<=n;i++)
{
scanf("%lld",&c[i]);
c[i]+=c[i-1];
}
vector<long long>dp(n+2,0);
vector<int>pos(n+2,0);
int l=1,r=1;
auto slope=[&dp,&c](int l,int r)
{
return 1.0*(dp[r]+c[r]*c[r]-dp[l]-c[l]*c[l])/(c[r]-c[l]);
};
for(int i=1;i<=n;i++)
{
while(l<r&&slope(pos[l],pos[l+1])<2.0*(i-pos[l]-1+c[i]-L))
{
l++;
}
int j=pos[l];
dp[i]=dp[j]+(i-j-1+c[i]-L-c[j])*(i-j-1+c[i]-L-c[j]);
while(l<r&&slope(pos[r],i)<slope(pos[r],pos[r-1]))
{
r--;
}
pos[++r]=i;
}
cout<<dp[n]<<endl;
return 0;
}
评测记录