【题目分析】
斜率优化DP
【代码】
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
long long dp[1000001],x[1000001],n;
long long que[1000001];
long long a,b,c,hd=1,tl=0;
inline double ang(long long j,long long k)
{
return (((double)dp[k]-dp[j])+a*((double)x[k]*x[k]-x[j]*x[j]))/(x[k]-x[j]);
}
int main()
{
scanf("%lld%lld%lld%lld",&n,&a,&b,&c);
for (long long i=1;i<=n;++i)
{
scanf("%lld",&x[i]);
x[i]+=x[i-1];
}
memset(dp,129,sizeof dp);
dp[0]=0;
// for (long long i=1;i<=n;++i)
// for (long long j=0;j<i;++j)
// dp[i]=max(dp[i],dp[j]+a*(x[i]-x[j])*(x[i]-x[j])+b*(x[i]-x[j])+c);
que[++tl]=0;
for (long long i=1;i<=n;++i)
{
while (hd<tl&&ang(que[hd],que[hd+1])>=(double)2*a*x[i]+b) hd++;
dp[i]=max(dp[i],dp[que[hd]]+a*(x[i]-x[que[hd]])*(x[i]-x[que[hd]])+b*(x[i]-x[que[hd]])+c);
while (hd<tl&&ang(que[tl-1],que[tl])<(ang(que[tl],i))) tl--;
que[++tl]=i;
}
printf("%lld\n",dp[n]);
}