トピックリンク
記事の他の首長を見て、なぜそれを右に制御する必要があります
それは実際には非常に簡単であるシミュレーションキュー横たわっ。。。
難易度は、私たちが法的な範囲内でいくつかを分析しなければならない質問の意味であり、異なる種の数がk + 2を超えることはできません。
ああ、もちろん、種の数によるが一種のように大きすぎる離散あなたはSTLのmapを使用することができ、
残りはシミュレートされ、コードを参照してください。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 マップ < int型、int型 > F; INTのTY、TOT、K、N、ANS。 INTのタイプ[ 100010 ]。 int型 NUM [ 100010 ]。 INT メイン(){ scanf関数(" %d個の%のD "、&N&K)。 以下のために(int型私= 1 ; iが<= N; iが++){ // 输入+离散化 のscanf(" %dの"、&TY)。 もし(F [TY])タイプの[I] = [TY] F; //は、元の数に現れた 他のタイプの[I] = ++ TOT、F [TY] = TOT; // 非表示、更新番号及び記録 } int型 CNT = 1。 、ヘッド= 1。 ; NUM [式[ 1 ] ++ ; のための(INT I = 2 ; I <= N; I ++は){ 一方(CNT> = K + 2){ // もし間隔データは以下2 + kよりなるまでK + 2種類の数左右点よりも大きい NUM [タイプ[ヘッド] - ; のiF(NUM [タイプ[ヘッド]] == 0) // 種の数がゼロに減少するとき、インターバルタイプの保存 cnt-- ; ヘッド ++ ; } IF CNT ++(NUM [タイプ[I]]!); // 更新 NUM [タイプ[I]] ++ ; ANS = MAX(ANS、NUM [タイプ[I]]); // この種の更新 } のprintf(" %のD " ;、ANS) 戻り 0 ; }