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 GET(INT 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 ; }