P3628 蒟蒻求救【斜率优化】
  • 板块学术版
  • 楼主Stay_Hungry
  • 当前回复12
  • 已保存回复12
  • 发布时间2020/6/17 20:28
  • 上次更新2023/11/7 00:28:35
查看原帖
P3628 蒟蒻求救【斜率优化】
105922
Stay_Hungry楼主2020/6/17 20:28

只有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 ;
}
2020/6/17 20:28
加载中...