1911: [Apio2010] Special Action Team time limit:4 Sec Memory limit:64 MB
submit:5057 solved:2492
[Submit] [Status] [Discuss] Descriptioninputoutputsample Input4
-1 10-20
2 2 3 4Sample Output9HINT
Dp[i]=dp[j]+a*x*x+b*x+c
X=SUM[I]-SUM[J]
proving monotonicity
dp[j]+a* (sum[i]- SUM[J]) * (Sum[i]-sum[j]) +b* (Sum[i]-sum[j]) +c>=dp[k]+a* (Sum[i]-sum[k]) * (Sum[i]-sum[k]) +b* (Sum[i]-sum[k]) +c
simplified dp[j]+a*sum[j]*sum[j]-2*a*sum[i]* Sum[j]-b*sum[j]>=dp[k]+a*sum[k]*sum[k]-2*a*sum[i]*sum[k]-b*sum[k]
To prove monotonicity, you need to prove the following formula
dp[j]+a* (Sum[t]-sum[j]) * (Sum[t]-sum[j]) +b* (Sum[t]-sum[j]) +c>=dp[k]+a* (Sum[t]-sum[k]) * (Sum[t]-sum[k]) +b* (sum [T]-sum[k]) +c
Jane Dp[j]+a*sum[j]*sum[j]-2*a*sum[t]*sum[j]-b*sum[j]>=dp[k]+a*sum[k]*sum[k]-2*a*sum[t]*sum[k]-b*sum[k]
Set T>i obviously sum[t]>=sum[i] set sum[t]=sum[i]+v
Substituting Sum[t] dp[j]+a*sum[j]*sum[j]-2*a*sum[i]*sum[j]-b*sum[j]+v*sum[j]>=dp[k]+a*sum[k]*sum[k]-2*a*sum[i]*sum[k] -B*SUM[K]+V*SUM[K]
Because of the j>k, the SUM[J]>=K is established and the decision Monotonicity is proved.
Certificate of Completion
Can write the slope type
Dp[j]+a*sum[j]^2-2*a*sum[i]*sum[j]-b*sum[j]>=dp[k]+a*sum[k]^2-2*a*sum[i]*sum[k]-b*sum[k] and J>k
= dp[j]-dp[k]+a*sum[j]^2-a*sum[k]^2+b*sum[k]-b*sum[j]>=sum[i]*2*a* (Sum[j]-sum[k])
= (Dp[j]-dp[k]+a*sum[j]^2-a*sum[k]^2+b*sum[k]-b*sum[j])/(2*a* (SUM[J]-SUM[K)) >=sum[i]
1#include <cstdio>2#include <algorithm>3#include <cstring>4#include <queue>5#include <cmath>6#include <vector>7#include <cstdlib>8#include <iostream>9 #definell Long LongTen #defineINF 2147483647 One #defineN 1000005 A using namespacestd; - ll Dp[n],sum[n]; - intA,b,c,q[n]; thell PW (ll x) {returnX*x;} ll S (intJintK) {return 2*a* (sum[j]-sum[k]);} -ll G (intJintK) {returnDP[J]-DP[K]+A*PW (Sum[j])-A*PW (Sum[k]) +b*sum[k]-b*sum[j];} - DoubleSlopeintJintK) {return(Double) G (j,k)/S (j,k);} - + intMain () { - intN; +scanf"%d",&n); Ascanf"%d%d%d",&a,&b,&c); at for(intI=1; i<=n;i++){ - intx; -scanf"%d",&x); -sum[i]=sum[i-1]+x; - } - intH=1, t=2; in for(intI=1; i<=n;i++){ - while(H +1<t&&slope (q[h],q[h+1]) <=sum[i]) h++; to intj=q[h],x=sum[i]-Sum[j]; +DP[I]=DP[J]+A*PW (x) +b*x+C; - while(H +1<t&&slope (i,q[t-1]) <=slope (q[t-1],q[t-2])) t--; theq[t++]=i; * } $printf"%lld", Dp[n]);Panax Notoginseng return 0; -}
BZOJ1911[APIO2010] Special Ops team slope optimization DP