站外题,除了 #1 其他都 WA 了。
#include<iostream>
#include<cstdio>
using namespace std;
const int N=5e5+100;
typedef long long ll;
int n,m,q[N],l,r;
ll a[N],dp[N];
ll get_x(ll x)
{
return 2*a[x];
}
ll get_y(ll x)
{
return dp[x]+a[x]*a[x];
}
ll slope_fz(ll x,ll y)
{
return get_y(x)-get_y(y);
}
ll slope_fm(ll x,ll y)
{
return get_x(x)-get_x(y);
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
dp[0]=q[0]=q[1]=0,l=1,r=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
a[i]+=a[i-1];
}
for(int i=1;i<=n;i++)
{
while(l<=r&&slope_fz(q[l+1],q[l])<=a[i]*slope_fm(q[l+1],q[l])) l++;
dp[i]=dp[q[l]]+m+(a[i]-a[q[l]])*(a[i]-a[q[l]]);
while(l<=r&&slope_fz(i,q[r])*slope_fm(q[r],q[r-1])<=slope_fz(q[r],q[r-1])*slope_fm(i,q[r])) r--;
q[++r]=i;
}
printf("%lld\n",dp[n]);
}
return 0;
}