斜率优化
这道题方程划开挺长的,一定要细心。
最后的斜率方程右边只能剩下含有 i 的项,不含 i 的项必须全部到左边
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
long long f[1010005];
long long o[1010005];
long long s[1010005];
int q[1010005];
long long a,b,c;
double Y(int j)
{
return (double)f[j]+a*s[j]*s[j];
}
double X(int j)
{
return (double)s[j];
}
double slop(int j1,int j2)
{
return (Y(j2)-Y(j1))/(X(j2)-X(j1));
}
int main()
{
int n;
scanf("%d",&n);
scanf("%lld%lld%lld",&a,&b,&c);
for (int i=1;i<=n;i++)
{
scanf("%lld",&o[i]);
s[i]=s[i-1]+o[i];
}
q[1]=0;
int l=1,r=1;
for (int i=1;i<=n;i++)
{
while(l<r&&slop(q[l],q[l+1])>=(double)(2*a*s[i]+b))l++;
int j=q[l];
f[i]=f[j]+a*(s[i]-s[j])*(s[i]-s[j])+b*(s[i]-s[j])+c;
while(l<r&&slop(q[r],q[r-1])<slop(q[r],i))r--;
q[++r]=i;
}
printf("%lld\n",f[n]);
}