LISフェンウィックツリーの最適化

 

LISことはよく知られて上昇最長シーケンス

DPの複雑さはO(N ^ 2)で解決することができます 

我々は、使用フェンウィックツリー(またはツリーライン)を最適化を検討します

フェンウィックツリーのメンテナンス間隔の最大値

(検索アルゴリズムでは省略元のO(N ^ 2))

だから私は、LISを終了するために見つけることができます

バイナリシーケンスは、現在のLISを得ることができます 

(qwq短いLIS何利便性の半分以上の数の質問の多くを必要とロングコードの量に加えて

小さな点が離散使用する可能性がありますがあります(ポータル

コードの実現の外観

 

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
INT [MXN]、B [MXN]、N、SZ、ANS
INT DP [MXN]、[MXN] F。
INT lowbit(INT X){
     戻り X&( - X)。
}
INT motify(int型のx、int型W){
     ため(; X <= Mであり、X + = lowbit(X)){
        F [X] = MAX(F [x]は、W)。
    }
}
INT  GETINT X){
     int型温度= 0 (; X; X- = lowbit(X)){
        TEMP = MAX(温度、F [X])。
    }
    戻り温度;
} 
INT {main()の
    cinを >> N;
    以下のためにint型 i = 1 ; iが++; iが<= N ){
        scansf(" %のD "、および[I])。
        B [i]は = [I]。
    }
    ソート(B + 1、B + N + 1 )。
    SZ =一意(B + 1、B + N + 1) - (B + 1 )。
    以下のためにint型 i = 1 ; iが++; iが<= N ){
        [I] = LOWER_BOUND(B + 1、B + SZ + 1、[I]) - B。
    }
    ANS = 0 ;
    以下のためにint型 i = 1 ; iが++; iが<= N ){
        DP [I] = GET([I] - 1)+ 1 ; // 最大上昇 
 //         DP [I] = GET([I])+ 1; // 最大長低下 
        ANS = MAX(ANS 、DP [I])。
        motify([I]、DP [I])。
    }
    coutの << 年。
    リターン 0 ;
}

 

おすすめ

転載: www.cnblogs.com/duojiaming/p/11671001.html
おすすめ