【原題】
【分析】只要跟著我前面的題目走,這道題真的是太水了。神馬題解都不用參考,公式隨便推。
易知方程是f[i]=max(f[j]+A*(sum[i]-sum[j])^2+B*(sum[i]-sum[j])+C)
設k比j優。
f[k]+A(sum[i]-sum[k])^2+B(sum[i]-sum[k])+C>f[j]+A(sum[i]-sum[j])^2+B(sum[i]-sum[j])+C
f[k]-2*A*sum[i]*sum[k]+A*sum[k]^2-B*sum[k]>f[j]-2*A*sum[i]*sum[j]+A*sum[j]^2-B*sum[j]
f[k]-f[j]+A*(sum[k]^2-sum[j]^2)+B*(sum[j]-sum[k])>2*A*sum[i]*(sum[k]-sum[j])
(f[k]-f[j]+A*(sum[k]^2-sum[j]^2)+B*(sum[j]-sum[k]))/2/(sum[k]-sum[j])/A
【代碼】
#include#include using namespace std; long long n,a[1000005],f[1000005],q[1000005],sum[1000005],ans,h,t,i,A,B,C,j; long long M(long long x){return x*x;} double xie(long long k,long long j) { double temp=(f[k]-f[j]+A*(M(sum[k])-M(sum[j]))+B*(sum[j]-sum[k])+0.0)/2.0/(sum[k]-sum[j])/A; return temp; } int main() { scanf("%lld",&n); scanf("%lld%lld%lld",&A,&B,&C); for (i=1;i<=n;i++) scanf("%lld",&a[i]),sum[i]=sum[i-1]+a[i]; f[0]=0;h=t=1ll;q[1]=0; for (i=1;i<=n;i++) { while (h xie(i,q[t])) t--; q[++t]=i; } printf("%lld",f[n]); return 0; }