看板
制限時間:8000分の20000 MS(Javaの/その他)メモリの制限:32768分の32768 K(Javaの/その他)
の合計提出(S):32864受理提出(S):13090
問題の説明
大学への入り口、(hはその高さであり、wはその幅)wはサイズH *の大きな長方形の看板があります。最寄りのプログラミングコンテスト、ダイニングルームメニューの変更、およびその他の重要な情報:ボードは、すべての可能なアナウンスが掲載されている場所です。
9月1日、看板は空でした。一つ一つが、発表は看板の上に置かれて始まりました。
各発表は、ユニットの高さの紙のストライプです。より具体的には、i番目の発表は、サイズ1 *ウィスコンシンの長方形です。
誰かが看板に新しいお知らせを置くと、彼女はいつもの発表のための最上位の可能な位置を選ぶだろう。すべての可能な最上位のポジションの中で彼女は、常に左端のいずれかを選択します。
新発表のための有効な場所がない場合、それは(いくつかのプログラミングコンテストは、この大学からの参加者を持っていない理由です)看板の上に置かれていません。
看板やアナウンスの大きさを考えると、あなたのタスクは、アナウンスが置かれている行の番号を見つけることです。
9月1日、看板は空でした。一つ一つが、発表は看板の上に置かれて始まりました。
各発表は、ユニットの高さの紙のストライプです。より具体的には、i番目の発表は、サイズ1 *ウィスコンシンの長方形です。
誰かが看板に新しいお知らせを置くと、彼女はいつもの発表のための最上位の可能な位置を選ぶだろう。すべての可能な最上位のポジションの中で彼女は、常に左端のいずれかを選択します。
新発表のための有効な場所がない場合、それは(いくつかのプログラミングコンテストは、この大学からの参加者を持っていない理由です)看板の上に置かれていません。
看板やアナウンスの大きさを考えると、あなたのタスクは、アナウンスが置かれている行の番号を見つけることです。
入力
複数のケース(せいぜい40例)があります。
入力ファイルの最初の行は、3つの整数番号、H、WおよびN含有(<= W 1 <= hを、10 ^ 9と、1 <= N <=20万) -ビルボードの寸法および発表の数。
i番目の発表の幅-次のn行のそれぞれは、整数番号のWi(1 <=のWi <= 10 ^ 9)を含みます。
入力ファイルの最初の行は、3つの整数番号、H、WおよびN含有(<= W 1 <= hを、10 ^ 9と、1 <= N <=20万) -ビルボードの寸法および発表の数。
i番目の発表の幅-次のn行のそれぞれは、整数番号のWi(1 <=のWi <= 10 ^ 9)を含みます。
出力
各発表のために(順番に、それらは入力ファイルに記載されている)出力つの番号 - このアナウンスが配置される行の数。行は、一番上の行で始まり、1からhまで番号が付けられています。発表は看板、出力に置くことができない場合は「-1」今回の発表のために。
サンプル入力
3 5 2 4 3 3 3
サンプル出力
1 2 1 3 -1
質問の意味:入力の複数のセット。N、W 3つの整数、時間を与えます。壁の高さ、幅、及びポスターの数は、代表でした。次に、Nポスター幅(既定の高さ)行あたりの行の数を表します
アイデア:壁セクションの最大の高さを維持することにあるツリーライン。
書式#include <iostreamの> の#include <cmath> の#include <cstdioを> する#include <CStringの> の#include < 文字列 > の#include <マップ> 書式#include <iomanip> 書式#include <アルゴリズム> 書式#include <キュー> の#include <スタック> #include < セット > の#include <ベクトル> // CONST int型MAXN = 1E5 + 5。 #defineは長い長いっ の#define INF 0x3fを の#define(I、a、b)は(;;私は= Bの<++私は= int型)用のため の#defineバグはcout <<」 LLのGCD(-1,11,11- b)は{ 戻り B GCD(B、%の?B);} LLのLCM(-1,11,11- b)は{ 返す / GCD(a、b)は* ; B} のconst int型 MAXN = 200000 + 5 。 使用して 名前空間はstdを、 INTのH、N、W。 構造体セグメント { int型のL、R。 int型の合計。 #define L(x)はツリー[X] .L の#define R(x)はツリー[X] .R の#define SUM(x)はツリー[X] .SUM }ツリー[MAXN * 4 ]。 無効ビルド(int型 Q、int型L、int型R) { L(Q) = L、R(Q)= R。 もし(L == R) { SUM(Q) = W。 返します。 } INT半ば=(L + R)/ 2 。 構築(Q * 2 、L、ミッド)。 構築(Q * 2 + 1、ミッド+ 1 、R); 和(Q) = MAX(SUM(Q * 2)、SUM(Q * 2 + 1 ))。 } ボイドclearr() { memsetの(木、0、はsizeof (木))。 } ボイド尋ねる(int型 Q、INT LEN) { 場合(L(Q)== R(Q)) { SUM(Q) - = LEN。 // coutの<< Q <<てendl; printf(" %d個の\ n " 、L(Q))。 返します。 } であれば(SUM(Q * 2)> = LEN)尋ねる(Q * 2 、LEN)。 それ以外の 場合(SUM(Q * 2 + 1)> = LEN)頼む(Q * 2 + 1 、LEN); 他printf(" -1 \ nを"); // COUT << Q << ENDL;} 和(Q)= MAX(SUM(Q * 2)、SUM(Q * 2 + 1 ))。 } int型のmain() { // freopenは( "C:\\ ACM \\ INPUT.TXT"、 "R"、STDIN)。 一方、(scanf関数(" %D%D%D "!、&H&W、&N)= EOF) { clearr()。 もし(H> N) H = N。 ビルド(1、1 、H)。 以下のための(int型 I = 1; iが<= N。++ I) { int型LEN。 scanf関数(" %のD "、およびLEN)。 もし((合計1)> = LEN) (ASK 1 、LEN)を、 他のprintf(" -1 \ nを" ); } } }