問題の意味
あなたが質問$ N $と$ K $を、$ 1 $と$ K $の間で各質問の難易度を持っていますか。
各難易度の異なる$ K $新しいトピックを収集し、それが競争を保持する必要がある、$ K $の各難しいトピックに$ 1 $が含まれています。
もちろん、それはタイトルが無効になります開催競技で使用されてきた、再利用することはできません。
あなたが最初の$のために問題外である場合、私は競争、その後、$ F(I)= 1 $、または$(I)= 0 $ F $を
最後に、$ iが$ N別$、およびスペースなしに$ 1 $から全ての$ F(I)$順次の出力を$ましょう。
$ 1 \ nは、K \ ^ 10 $ 5
解決
もちろん、我々は試合を開催できる回数を見つけることができ、各難易度に生じるで$ K $の質問$ 1 $の最小数です。
その後、我々はものを見つけることができます:私たちは$ xには$トーナメントを主催している場合、あなたは知っておく必要がありますすべての難易度は$ xには$以上である現在のトピックの数です。
この事は非常によく私たちは困難なトピックが表示され、各番号をオンライン処理時間を必要とする、尋ねます。
すべての数が$ 10 $ ^ 5以下であるので、バケットは同じ難易度が発生する回数の記録を開始することができます。
私たちはその答え、$ CNT $バレルとして$和$レコードを配列を定義し、$ sum_i $はトーナメントの前に$ Iの$タイトルのいくつかを持っている数です。
その後は、$ P $する$ X $の数ので、プラス$ cnt_x $、$ sum_ {cnt_x} = Pの$缶用。
最後に、$ X $ $ 1 $を押してみましょう$ \分\ {cnt_i \} $、回答ANSの$シーケンスを記録することにより$配列、すなわち、聞かせてから$ ans_ {SUM_X} = 1 $
その後、出力ができます。
参照コード
#include <cstdioを>
の#define N 100010
int型 K、N、CNT [N]、合計[N ]、 ANS [N]、ミネソタ州= 1E9 。 インラインINT分(INT A、INT B){ 戻り <bは?A:B; } int型のmain(){ scanf関数(" %D%dの"、&K&N) 以下のために(int型 i = 1 ; iが<= N; iが++ ){ scanf関数(" %のD "、&A )。 合計[++ CNT []] = I; }
のために(int型 I = 1 ; 私は= Kを<。私は++ ) ミネソタ州 = 分(ミネソタ州、CNT [I])。 以下のために(int型 i = 1 ; iが<=ミネソタ州; iは、++は) [和[I] ANS ++を、 用(int型 i = 1 ; iが<= N iが++ ) のprintf(" %dの" 、ANS [I])。 リターン 0 ; }