問題の意味: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 - 1、1、nは、1 )。 upsum(V [C] .back() + 1、I- 1、 - 1、1、nは、1 )。 V [C] .pb(I)。 INT P =(V [C] .size() - K- 1 )。 もし(P> = 0 ) upsum(V [C] [P] + 1、V [C] [P + 1 ]、1、1、nは、1 )。 INT J = qsum(1、nは、1、nは、1 )。 もし(!j)を続けます。 ANS= MAX(ANS、I-J + 1 )。 } COUT << ANS << ENDL。 } 戻り 0 。 }