只有10分的斜率优化(还不如暴力)……
找了好久找不出错,求救
#include <cstdio>
#include <algorithm>
using namespace std ;
const int N = 1e6 + 5 ;
int n , a , b , c , q[ N ] , l = 1 , r = 0 ;
long long s[ N ] , f[ N ] ;
long long y( int p ) { return f[ p ] + a * s[ p ] * s[ p ] ; }
long long x( int p ) { return s[ p ] ; }
long long k( int p ) { return 2 * a * s[ p ] + b ; }
long long F( int x ) { return a * x * x + b * x + c ; }
signed main() {
scanf( "%d %d %d %d" , &n , &a , &b , &c ) ;
for( int i = 1 ; i <= n ; ++i ) scanf( "%lld" , s + i ) , s[ i ] += s[ i - 1 ] ;
q[ ++ r ] = 1 ; f[ 1 ] = F( s[ 1 ] ) ;
for( int i = 2 ; i <= n ; ++i ) {
while( l <= r && y( q[ l + 1 ] ) - y( q[ l ] ) >= k( i ) * ( x( q[ l + 1 ] ) - x( q[ l ] ) ) ) ++ l ;
f[ i ] = f[ q[ l ] ] + F( s[ i ] - s[ q[ l ] ] ) ;
while( l <= r && ( y( q[ r ] ) - y( q[ r - 1 ] ) ) * ( x( i ) * x( q[ r ] ) ) <= ( y( i ) - y( q[ r ] ) ) * ( x( q[ r ] ) - x( q[ r - 1 ] ) ) ) -- r ;
q[ ++ r ] = i ;
}
printf( "%lld\n" , f[ n ] ) ;
return 0 ;
}