BZOJ 1096 [ZJOI2007]倉庫建設

 

$ dp_i $は$ I $の中に建て倉庫の後に最小コストを表します。
伝達方程式である
$ dp_i = \分\ {dp_j + \和\ limits_ {K = J + 1} ^ {I-1} p_k \回(X_I-X_K)+ C_I \} = \分\ {dp_j + X_I \ 和\ limits_ {K = J + 1} ^ {I-1} p_k- \和\ limits_ {K = J + 1} ^ {I-1} p_kx_k + C_I \} $
$ g_i =設定- \和\ limits_ {J = 1} ^ iはp_jx_j $、$ P_I $ プレフィックスとなります。
伝達方程式は$ dp_i = \分\ {dp_jなり 、$ + X_I(P_ {I-1} -p_ {J})+ G_ {I-1} -g_j + C_I \} スロープを最適化することができ、勾配があります$ P_ {I-1} $の保証の増加、それは単調な決定である、それは使用済みの両端キューすることができます。

#include <ビット/ STDC ++ H>
 に#define LL長い長い
 使用して 名前空間STDを、

名前空間IO {
     CONST  INT MAXSIZE = 1 << 20 チャー BUF [MAXSIZE]、* P1 * 、P2。
    #define GC()(P1、P2 == &&(P2 =(P1 = BUF)+のfread(bufは、1、MAXSIZE、STDIN)、P1 == P2)EOF:?* P1を++)
    テンプレート <型名T> 
    インライン無効読みます(T&X){ 
        X = 0T F = 1チャー CH = GC()。
        しばらく(CH < "0 " || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1CH = GC()。}
         一方、(CH> = ' 0 ' && CH <= ' 9 '){X = X * 10 + CH - 48CH = GC()。} 
        、X * = F。    
    } 
} 使用して 名前空間をIO。

CONST  INT N = 1E6 + 7 

LL X [N]、P [N]、C [N]、G [N]、DP [N]。
INT QUE [N]。

インラインLL X(INT I){
     戻りP [i]は、
} 

Y(LLインラインint型のI){
     戻り DP [I] - G [i]は、
} 

インライン二重 K(INT I、int型のJ){
     リターンダブル)(Y(I) - Y(J))/(ダブル)(X(I) - X(J))。
} 

int型のmain(){
     // freopenは( "in.txt"、 "R"、標準入力)。
    int型のn; 
    (n)を読み出します。
    以下のためにINT iが= 1 ; I <= N; I ++ ){
        (X [I])を読み取り、(P [I])を読み取り、(C [I])を読み出します。
        G [I] = G [I - 1 ] - P [I] * X [i]は、
        P [I] + = P [I - 1 ]。
    } 
    int型の L = 1、R = 1 以下のためにINT iが= 1 ; I <= N; I ++ ){
         一方(L <R && K(QUE [L]、QUE [L + 1 ])<= X [i])とL ++ INT J = QUE [L]。
        DP [I] = DP [J] + X [I](* P [I - 1 ] - P [J])+ G [I - 1 ] - G [J] + C [i]は、
        同時に(L <R && K(QUE [R]、QUE [R - 1 ])> = K(QUE [R]、i))をr--の
        QUE [ ++ R] = I。
    } 
    のprintf(" %のLLD \ n " 、DP [N])。
    リターン 0 ; 
}
コードの表示

 

おすすめ

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