@[190040257a](/user/233957) 按理说加个等号确实没问题,道理正如你说的那样。但不知道为什么你的代码就不行,可能是打丑了吧。
by JimmyFlower @ 2020-08-27 10:08:02
这是我的代码,我习惯是加$=$号的,把那些相同的决策点都弹掉。
```cpp
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ri register int
typedef long long ll;
using namespace std;
ll head,tail,q[1000010];
ll n,a,b,c,x[1000010],s[1000010],f[1000010];
inline double X(int j){return double(s[j]);}
inline double Y(int j){return double(f[j]+a*s[j]*s[j]-b*s[j]);}
inline double slope(int j1,int j2){return (Y(j2)-Y(j1))/(X(j2)-X(j1));}
int main()
{
scanf("%lld %lld %lld %lld",&n,&a,&b,&c);
for(ri i=1;i<=n;i++) scanf("%lld",&x[i]),s[i]=s[i-1]+x[i];
memset(f,0,sizeof(f));
head=tail=1,q[1]=0;
for(ri i=1;i<=n;i++)
{
while(head<tail&&slope(q[head],q[head+1])>=2.0*a*s[i]) head++;
f[i]=f[q[head]]+a*(s[i]-s[q[head]])*(s[i]-s[q[head]])+b*(s[i]-s[q[head]])+c;
while(head<tail&&slope(q[tail-1],q[tail])<=slope(q[tail],i)) tail--;
q[++tail]=i;
}
printf("%lld",f[n]);
return 0;
}
```
by JimmyFlower @ 2020-08-27 10:09:46
@[190040257a](/user/233957) **可能**是精度问题
by ducati @ 2021-04-09 20:27:16