1 /**************************************************************
8 ****************************************************************/
11 dp[i] = max{dp[j-1] + a*sqr(sum[i]-sum[j-1])+b*(sum[i]-sum[j-1])+c}
13 dp[k-1]+a*sqr(sum[i]-sum[k-1])+b*(sum[i]-sum[k-1]) > dp[j-1]+a*sqr(sum[i]-sum[j-1])+b*(sum[i]-sum[j-1])
14 dp[k-1] + a*(-2*sum[i]*sum[k-1]+sqr(sum[k-1])) + b*(-sum[k-1]) > dp[j-1] + a*(-2*sum[i]*sum[j-1]+sqr(sum[j-1])) + b*(-sum[j-1])
16 (dp[k-1]+a*sqr(sum[k-1])-b*sum[k-1]) - (dp[j-1]+a*sqr(sum[j-1])-b*sum[j-1]) > 2a*sum[i]*(sum[k-1]-sum[j-1])
18 y(k) = dp[k-1]+a*sqr(sum[k-1])-b*sum[k-1]
21 y(k)-y(j) > sum[i]*(x(k)-x(j))
30 #define sqr(x) ((x)*(x))
31 #define cal(x) (a*sqr(x)+b*(x)+c)
34 typedef long long int64
;
37 int64 a
,b
,c
,sum
[maxn
],dp
[maxn
];
39 inline double y(int k
) {
40 return dp
[k
-1] + a
*sqr(sum
[k
-1]) - b
*sum
[k
-1];
43 inline double x(int k
) {
47 inline double slope(int p
, int q
) {
48 return (y(p
)-y(q
)) / (x(p
)-x(q
));
53 scanf("%lld%lld%lld",&a
,&b
,&c
);
55 for (i
=1; i
<=n
; ++i
) scanf("%lld",sum
+i
);
56 for (i
=1; i
<=n
; ++i
) sum
[i
] += sum
[i
-1];
57 int *qf
= &queue
[1], *qr
= &queue
[0];
58 for (i
=1; i
<=n
; ++i
) {
59 while (qf
< qr
&& slope(*(qr
-1),*qr
) > slope(*qr
,i
)) --qr
;
61 while (qf
< qr
&& slope(*qf
,*(qf
+1)) < sum
[i
]) ++qf
;
62 dp
[i
] = dp
[*qf
- 1] + cal(sum
[i
] - sum
[*qf
- 1]);
64 printf("%lld\n",dp
[n
]);