質問の意味:N、C、K与えられました。
次に、(1〜C間)Q最長間隔の長さをn個の数字を与えます。kのいずれかの発生を満たすセクション番号は、少なくとも一度表示されます。
アイデア:
私たちは、おそらく間隔を判断するための基準を満たすことができて、再度パーティション間のための条件のインデックス番号を満たしていない区間を押すと、再び判断します。
すべての可能性までは間隔の条件を満たすために、完成と判断されています。
:ピット
より複雑な境界(L、R)及び状態の治療のため、パーティション間に特に注意を払っ数との関係の主題の下で満足していません。
:ピット
より複雑な境界(L、R)及び状態の治療のため、パーティション間に特に注意を払っ数との関係の主題の下で満足していません。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #defineは(B)のmemset(A、B、はsizeof(A))を満たし intを [ 100009 ]。 int型 ANS = 0 ; マップ < int型、ベクトル< int型 >> POS。 int型N、C、K。 ボイド DFS(int型 L、INT R) { // COUT << L << "............." << R << ENDL。 もし(R-L + 1 <k)のリターン; もし(L == R) { もし(K <= 1)ANS = MAX(ANS、1 )。 返します。 } 他の 場合(R <L)のリターン; int型私= 0 ; 用(i = 1; I <= R; iは++ ){ int型 TL = LOWER_BOUND(。。POS [I](開始)、POS [i]は】終了()、L) - POS [私が始める(); INT TR = UPPER_BOUND(。。POS [I])(開始、POS [I]の端部()、R) - 。POS [[I]])(始めます。 もし(TR-TL <k)を破ります。 } もし(I == R + 1)ANS = MAX(ANS、R-L + 1 )。 他の { int型 = STをリットル、J。 用(J = 0 ; J <POS [I]サイズ(); J ++)場合(ST <= POS [I]、[J])ブレーク。 用(; J <POS [I]サイズ()&& POS [I]、[J] <R; J ++ ) { DFS(ST、POS [I]、[J] - 1 )。 ST = POS [I] [J] + 1 。 } であれば(J < POS [I]のサイズ()。) DFS(ST、R) 他 { DFS(POS [I]、[J - 1 ] + 1 、R)。 } } を返します。 } INT メイン() { 一方(CIN >> N >> C >> K) { ため(int型 i = 1 ; iは= Cを<I ++はPOS [I] .clear())。 会った(0 )。 ANS = 0 ; 以下のために(int型 i = 1 ; iが<= N; iが++ ) { scanf関数(" %dを"&[I])。 POS [I]一back(I)。 } // COUT << "1" <<」「<< N << ENDL。 DFS(1 、N) coutの<< ANS << てendl; } 戻り 0 。 }