2最長サブアレイの学校マルチセグメントツリー

  問題の意味:n個のC kおよびAl(1-N)の所定のシーケンスの数範囲内の全ての数は、1-Cであるすべての要素が0または> = kの間隔で現れるように、最長間隔の長さを見つけます

 

ソリューション:

右端が固定されている場合、各要素のために、生存は、2つの連続する点添字間隔を残しました。
各要素について、そのセグメントツリープラスワン左点の範囲が可能です。
右にすると、右のポイント、実行可能な左の点Cの要素を維持します。
セグメントツリーはインデックスのみを照会することができますCの最小値を依頼する必要があります。

 

非常に明確に非常に良いセグメントツリーのタイトルを考えてマップを描きます 

値によって、最も下の主題を維持するために世話をして 

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
// BXDによる入力
の#define担当者(iは、b)のための(; iは=(b)の<I ++はiは(A)= INT)
 の#defineためreppを(I、B)(I =(A int型); I> =(B); - I)
 の#define RI(N)のscanf( "%d個"、&(N))
 の#define RII(N、M)のscanf( "%D%dの"、およびN、 &M)
 の#define RIII(N、M、K)のscanf( "%D%D%D"、&N、&M&K)
 の#define RS(S)のscanf( "%sの"、S);
#defineは長い長いっ
 の#define LSONのL、M、POS << 1
 の#define rsonのM + 1、R、POS << 1 | 1
 の#define PBの一back用
 の#define REP(I、N)(iは0 = int型のために、 iが(N)<。
///////////////////////////////// / 
の#define 0x3f3f3f3f INF
 CONST  INT N = 1E5 + 5 int型 T [N << 2 ]、COL [N << 2 ]、X [N << 2 ]。
INT C、K、N、M。
ベクター < INT > V [N]。
無効アップ(int型のPOS)
{ 
    T [POS] = MAX(T [POS << 1 ]、T [POS << 1 | 1 ])。
    X [POS] =(T [POS] == T [POS << 1 ])はx [POS <<?1 ]、X [POS << 1 | 1 ]。
} 
ボイド(ダウンint型POS)
{ 
    場合(COL [POS])
    { 
        T [POS << 1 ] + = COL [POS]。
        T [POS << 1 | 1 ] + = COL [POS]。
        COL [POS << 1 ] + = COL [POS]。
        COL [POS << 1 | 1 ] + = COL [POS]。
        COL [POS] = 0 ; 
    } 
} 
ボイドビルド(int型 L、int型の R、int型のPOS)
{ 
    X [POS] COL [POS = L = 0 もし(L == R){T [POS] = 0 ; 返します}
     INT M =(L + R)>> 1 ;(LSON)を構築し、(rson)を構築し、アップ(POS)。
} 
ボイド upsum(int型 L、INT R、int型 V、INTを L、int型の R、int型のPOS)
{ 
    場合(L> R)のリターン;
    もし(L <= 1 && R <= R){COL [POS] + = V; T [POS] + = V。返します}
     INT M =(L + R)>> 1 ;ダウン(POS)。
    もし(L <= M)upsum(L、R、V、LSON)。
    もし(R> M)upsum(L、R、V、rson)。
    (POS)アップ。
} 
INT qsum(INT L、のint R、int型の L、int型の R、int型のPOS)
{ 
    場合(L <= 1 && R <= R)
    { 
        戻り T [POS] == C X [POS]:0 
    } 
    INT M =(L + R)>> 1 ;ダウン(POS)。
    もし(L <= M)// 这里一定要注意细节
    {
         int型 T = qsum(L、R、LSON)。
        もし(t)はリターントン。
    }
    もし(R> M)戻りqsum(L、R、rson)。
    リターン 0 ; 
} 
int型C。
INT メイン()
{ 
    一方(CIN >> N >> C >> K)
    { 
        担当者(I、1、C + 1)V [I] .clear()、V [i]は.pb(0 )。
        (ビルド1、nは、1 )。
        int型 ANS = 0 ; 
        担当者(I、1 、N)
        { 
            RI(C); 
            upsum(I、I、C - 11、nは、1 )。

            upsum(V [C] .back() + 1、I- 1、 - 11、nは、1 )。
            V [C] .pb(I)。
            INT P =(V [C] .size() - K- 1 )。
            もし(P> = 0 
            upsum(V [C] [P] + 1、V [C] [P + 1 ]、11、nは、1 )。
            INT J = qsum(1、nは、1、nは、1 )。
            もし(!j)を続けます
            ANS= MAX(ANS、I-J + 1 )。
        } 
        COUT << ANS << ENDL。
    } 
    戻り 0 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/bxd123/p/11241725.html