美文网首页信息学竞赛题解(IO题解)动态规划
BZOJ-1911: [Apio2010]特别行动队(DP+斜率

BZOJ-1911: [Apio2010]特别行动队(DP+斜率

作者: AmadeusChan | 来源:发表于2018-10-16 20:32 被阅读0次

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1911

嗯。。。方程很好想吧?f( i ) = max{ f( j - 1 ) + value( j , i ) } value( j , i ) 表示从i选取到j在连续一段中的价值。

然后化简:

令:

s[ i ] = x[ 1 ] + ... + s[ i ]

X( i ) = ( 2 * a * s[ i - 1 ] )

Y( i ) = ( a * s[ i - 1 ] * s[ i - 1 ] - b * s[ i - 1 ] + f[ i - 1 ] )

A( i ) = ( a * s[ i ] * s[ i ] + b * s[ i ] + c )

f( j - 1 ) + value( j , i )

= A( i ) + Y( j ) - s[ i ] * X( j )

然后令 j > k ,且 f( j - 1 ) + value( j , i ) > f( k - 1 ) + value( k , i ) ,则最终可化为:

( Y( j ) - Y( k ) ) / ( X( j ) - X( k ) ) < s[ i ] ,那么就是用单调队列维护凸单调性的斜率优化了,O( n )时间复杂度。

代码:

eaf81a4c510fd9f9f2054710272dd42a2834a4bc.jpg.png
#include <cstdio>
#include <algorithm>
#include <cstring>
 
using namespace std ;
 
#define MAXN 1000100
#define X( i ) ( 2 * a * s[ i - 1 ] )
#define Y( i ) ( a * s[ i - 1 ] * s[ i - 1 ] - b * s[ i - 1 ] + f[ i - 1 ] )
#define A( i ) ( a * s[ i ] * s[ i ] + b * s[ i ] + c )
#define value( j , i ) ( a * ( s[ i ] - s[ j - 1 ] ) * ( s[ i ] - s[ j - 1 ] ) + b * ( s[ i ] - s[ j - 1 ] ) + c + f[ j - 1 ] )
#define ll long long 
 
void getint( ll &t ) {
    int ch ; bool flag = false ;
    for ( ch = getchar(  ) ; ! ( ch >= '0' && ch <= '9' ) ; ch = getchar(  ) ) if ( ch == '-' ) flag = true ;
    t = ch - '0' ;
    for ( ch = getchar(  ) ; ch >= '0' && ch <= '9' ; ch = getchar(  ) ) t *= 10 , t += ch - '0' ;
    if ( flag ) t = - t ;
}
 
ll a , b , c , n , s[ MAXN ] , f[ MAXN ] ;
int Q[ MAXN ] , head , tail ;
 
double K( int i , int j ) {
    ll x = X( i ) - X( j ) , y = Y( i ) - Y( j ) ;
    double ret = double( y ) / double( x ) ;
    return ret ;
}
 
int main(  ) {
    getint( n ) ; getint( a ) , getint( b ) , getint( c ) ;
    s[ 0 ] = 0 ;
    for ( int i = 0 ; i ++ < n ; ) {
        ll x ; getint( x ) ; s[ i ] = s[ i - 1 ] + x ;
    }
    f[ 0 ] = 0 ; Q[ head = tail = 1 ] = 1 ;
    for ( int i = 0 ; i ++ < n ; ) {
        while ( head < tail && K( Q[ head ] , Q[ head + 1 ] ) < s[ i ] ) head ++ ;
        f[ i ] = value( Q[ head ] , i ) ;
        while ( head < tail && K( Q[ tail - 1 ] , Q[ tail ] ) > K( Q[ tail ] , i + 1 ) ) tail -- ;
        Q[ ++ tail ] = i + 1;
    }
    printf( "%lld\n" , f[ n ] ) ;
    return 0 ;
}

相关文章

  • BZOJ-1911: [Apio2010]特别行动队(DP+斜率

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1911 嗯...

  • 寻找昆虫特别行动队

    很开心在好朋友的推荐下参加了一期寻找昆虫特别行动队,在老师的带领下,一起在园博园开始了寻找小动物之旅,小朋友们受益...

  • BZOJ-1096: [ZJOI2007]仓库建设(DP+斜率优

    趁着今天刚学多写几道斜率优化的DP。。。 推导10分钟,代码5分钟,DEBUG一个晚上,最后发现X(),Y()写反...

  • DP训练——斜率优化DP

    斜率优化DP 斜率优化DP涉及到的模型较多,在编写习题题解前,先做出如下规律总结。 如何识别斜率优化DP 按照正常...

  • 特别行动

    某年某月的某日,在我们的“训练基地”,我们的“小朋友黑衣军”已经把装备准备好了,随时可以准备出发。 我们的队员...

  • 特别行动

    速度与激情的特别篇,速度在线激情也在线,开场迟到一分钟感觉错过了很多延续 现在流行的一句话:永远不放弃。安逸的生活...

  • Math.atan与Math.atan2计算两点间连线的倾斜角

    我们可以使用正切Math.tan()操作将角度转变为斜率,那么怎样利用斜率来转换为角度呢?可以利用斜率的反正切函数...

  • 财富专栏复习课10——元认知能力

    元认知能力即学习思考的能力。这是一种更高级的思考能力。就像对斜率再次求导。通过控制斜率的导数来控制斜率。元认知能力...

  • 《胖子行动队》:不是演员的胖子不是好导演

    《胖子行动队》,从片名就可以获得三个关键词“胖子”,“行动”,“队”。基...

  • 胖子行动队

    《胖子行动队》 包贝尔导演和文章一起主演的电影,咋这么尴尬呢?胖子咋了?以胖子取乐就牛逼了,电影中的那些烂梗,还有...

网友评论

    本文标题:BZOJ-1911: [Apio2010]特别行动队(DP+斜率

    本文链接:https://www.haomeiwen.com/subject/xflkzftx.html