「SCOI2015」小さな凸演奏室

タイトル説明

小さな正方形と小突起類似プレイエスケープチャンバは、チャンバは、各ノードがバルブを有し、完全二分木は$ $ N-ノードを有しています。すべての球根は、秘密の部屋を脱出するために点灯することができます。各ランプは、各辺が$ b_i $の重量を有する、$ a_iを$の量を有しています。

各新しい照明は、ランプに等しいランプコスト$の$ Vは、この点$ $ $ U-V $距離の$ D(U、Vに点灯された後、$ 1 $第照明電球は、取りません重量ポイント値$ a_vの$を乗じました)$、。

点灯中、すべての通信は、ランプバルブを他のすべてのランプを点灯するために照明サブツリーの後に点灯されなければならない電球を点灯しなければならないことを保証するために、いつでも。少なくともそれは秘密の部屋エスケープ過ごすためにそれらを教えてください。

データ範囲

$ 1 \当量N \の当量2 \回10 ^ 5 1 <a_iを、B_i \の当量10 ^ 5 $

問題の解決策

私は$サブツリー、転移は彼の息子と周りに移動することを検討、$ jの$の最小コストに直接行く暴力は、$ F_ {I、J} $は$完成表しを考えてみましょう。

私達はちょうど$ fが$値の$ Iの$祖先または祖先が、その後の$ nlogn $の複雑さに落ちたことができますの別の息子であるの$ jは$で見つけることができます知っている必要があります。

私は息子が残さ$葉または$の場合のために$ iの$ことに注意してください。

コード

#include <ビット/ STDC ++ Hが>
 の#define LL長い長い
 使用して 名前空間STDを、
CONSTの INT N = 2E5 + 5 INT、N; LL [N]、[N]、F [N] B [ 20 ]、G [N]、[ 20 ]、ANS = 2E18。
INT メイン(){ 
    scanf関数(" %のD "、&N)
    以下のためにint型私= 1 ; iが<= N; iが++ 
        のscanf(" %のLLD "、および[I])。
    以下のためにint型 I = 2 iが= N <; I ++は
        (scanf関数を " %のLLD "、&​​B [i])と、B [I] + = B [I >> 1 ]。
    以下のためにint型 I = N、L、Rを、私は; i-- ){ 
        L = I << 1 ; R = L | 1 ;
        以下のためにint型 J = I、X、Yは、= 1、J> 1 ; J >> = 1、Y ++ ){ 
            X = J ^ 1 場合(L> N)[I] [Y] = [X] * F(B [I] + B [X] - (B [J >> 1 ] << 1 ))。
            他の 場合(R> N)F [i]を[Y] = F [L] [Y + 1 ] + [L] *(B [L] - B [I])。
             F [i]を[Y] =分([L] *(B [L] -b [I])+ F [L] [ 1 ] + F [R] [Y + 1 ]、
                            [R] * (B [R] -b [I])+ F [R] [ 1 ] + F [L] [Y + 1 ])。
        } 
    } 
    のためのint型 I = N、L、Rを、I; i-- ){ 
        L = I << 1 ; R = L | 1 ;
        以下のためにint型 J = >> 1、Yが= 1 ;; J >> = 1、Y ++ ){
             もし - (L> N)G [i]を[Y]は[J] *(B [I] = Bを[J])。
            他の 場合(R> N)G [i]と[Y] = G [L] [Y + 1 ] + [L] *(B [L] - B [I])。
             G [i]を[Y] =分([L] *(B [L] -b [I])+ F [L] [ 1 ] + G [R] [Y + 1 ]、
                            [R] * (B [R] -b [I])+ F [R] [ 1 ] + G [L] [Y + 1 ])。
            もし(J!)ブレーク
        } 
    } 
    のためのint型 J、X、I = 1 ; iが<= N iが++ ){ 
        LLのV = G [i]が[ 1 ]; J = >> 1 ; X = I ^ 1 一方、(J){
             場合(X> N)、V + = [J >>1] *(B [J] -b [J >> 1 ])。
            そうでなければ、V + = [X] *(B [X] -b [J])+ G [X] [ 2 ]。
            X = J ^ 1 ; J >> = 1 ; 
        } 
        ANS = 分(ANS、V)。
    } 
    戻り COUT << ANS << ENDL、0 
}

 

おすすめ

転載: www.cnblogs.com/xjqxjq/p/11779154.html