BZOJ 1010 HNOI2008]おもちゃ梱包おもちゃ

$ Dpが[i]は$ $ I $の記事は、最小のコストで終わる表現しました

$ DP [i]は=分(DP [J] +(J - I + \和c_k - L)^ 2)$

スロープの最適化]をクリックします。

#include <ビット/ STDC ++ H>
 に#define LL長い長い
 使用して 名前空間STDを、
 
CONST  INT N = 5E4 + 7 
LL和[N]、L、C [N]、DP [N]。
INT QUE [N]、N。
 
テンプレート < クラス T> 
インラインT SQR(T A){ 
    戻り * 
} 
 
インラインLL X(INT I){
     戻り和[I]。
} 
 
Y(LLインラインINT I){
     戻り DP [I] + SQR(和[I])+ 2 * L * 和[I]。
} 
 
インライン二重 K(INT I、INT J){
     リターン 1.0 *(Y(I) - Y(J))/(X(I) - X(J))。
} 
 
int型のmain(){ 
    scanf関数(" %D%LLD "、&​​N、&L)。
    以下のためにINT iが= 1 ; I <= N; I ++ 
        のscanf(" %のLLD "、&​​C [i])と、和[I] =和[I - 1 ] + C [i]は、
    以下のためにINT iが= 1 ; I <= N; I ++ 
        和[I] + = I。
    int型のヘッド= 1、尾= 1 
    L ++ ;
    以下のためにINT iが= 1 ; I <= N; I ++ ){
         一方(ヘッド<尾&& K(QUE [頭部]、QUE [ヘッド+ 1 ])< 2 *和[i])とヘッド++ int型 J = queの[ヘッド]。
        DP [I] = DP [J] + SQR(和[I] -和[J] - L)。
        一方 - (頭<尾&& K(QUE [テール1 tail-- K(QUE [尾]、I)、QUE [尾])]>) 
        QUE [ ++尾] = I; 
    } 
    のprintf(" %のLLD \ n "、DP [N])。
    リターン 0 ; 
}
コードの表示

おすすめ

転載: www.cnblogs.com/Mrzdtz220/p/12230569.html