本文共 2011 字,大约阅读时间需要 6 分钟。
题意
n n n名士兵,你需要把士兵分成连续的一段一段特别行动队
设其中一队的战斗力和为 x x x,那么修正战斗力是 a x 2 + b x + c ax^2+bx+c ax2+bx+c(当然 a < 0 a<0 a<0)
求一种分组方式,使得修正战斗力之和最大
转移方程为
f [ i ] = f [ j ] + a ∗ ( s u m i − s u m j ) 2 + b ∗ ( s u m i − s u m j ) + c f[i]=f[j]+a*(sum_i-sum_j)^2+b*(sum_i-sum_j)+c f[i]=f[j]+a∗(sumi−sumj)2+b∗(sumi−sumj)+c
f [ i ] = f [ j ] + a ∗ s u m i 2 + a ∗ s u m j 2 − 2 a ∗ s u m i ∗ s u m j + b ∗ s u m i − b ∗ s u m j + c f[i]=f[j]+a*sum_i^2+a*sum_j^2-2a*sum_i*sum_j+b*sum_i-b*sum_j+c f[i]=f[j]+a∗sumi2+a∗sumj2−2a∗sumi∗sumj+b∗sumi−b∗sumj+c
2 a ∗ s u m i ∗ s u m j + f [ i ] − a ∗ s u m i 2 − b ∗ s u m i − c = f [ j ] + a ∗ s u m j 2 − b ∗ s u m j 2a*sum_i*sum_j+f[i]-a*sum_i^2-b*sum_i-c=f[j]+a*sum_j^2-b*sum_j 2a∗sumi∗sumj+f[i]−a∗sumi2−b∗sumi−c=f[j]+a∗sumj2−b∗sumj
把 2 ∗ a ∗ s u m i 2*a*sum_i 2∗a∗sumi看作斜率, s u m j sum_j sumj看作自变量 x x x,等式右边看作 y y y
那么就是要最大化截距,维护一个上凸壳
当 s l o p e ( q h e a d , q h e a d + 1 ) > 2 ∗ a ∗ s u m i slope(q_{head},q_{head+1})>2*a*sum_i slope(qhead,qhead+1)>2∗a∗sumi时, h e a d + + head++ head++
然后用队头更新 f [ i ] f[i] f[i]
我们加入点 i i i也需要维护上凸壳的斜率单调性
若 s l o p e ( q t a i l − 1 , q t a i l ) > = s l o p e ( q t a i l , i ) slope(q_{tail-1},q_{tail})>=slope(q_{tail,i}) slope(qtail−1,qtail)>=slope(qtail,i)说明在上凸壳上,否则就踢出队列
#includeusing namespace std;#define int long longconst int maxn = 1e6+10;int n,a,b,c,sum[maxn],f[maxn];int head = 1, tail = 0, q[maxn];int x(int i){ return sum[i]; }int y(int i){ return f[i]+a*sum[i]*sum[i]-b*sum[i]; }double slope(int i,int j){ return ( 1.0*y(i)-y(j) )/( 1.0*x(i)-x(j) );}signed main(){ cin >> n >> a >> b >> c ; for(int i=1;i<=n;i++) cin >> sum[i]; for(int i=1;i<=n;i++) sum[i] += sum[i-1]; q[++tail] = 0; for(int i=1;i<=n;i++) { while( head+1<=tail && slope(q[head],q[head+1])>2*a*sum[i] ) head++; int las = q[head]; f[i] = f[las]+a*sum[i]*sum[i]+a*sum[las]*sum[las]-2*a*sum[i]*sum[las]+b*sum[i]-b*sum[las]+c; while( tail-1>=head && slope(q[tail-1],q[tail])<=slope(q[tail],i) ) tail--; q[++tail] = i; } cout << f[n];}
转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/116272325 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!