关于斜率优化蒟蒻有个问题

P3628 [APIO2010] 特别行动队

@[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


|