$ 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 = 0。T F = 1。チャー CH = GC()。 しばらく(CH < "0 " || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1。CH = GC()。} 一方、(CH> = ' 0 ' && CH <= ' 9 '){X = X * 10 + CH - 48。CH = 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 ; }