HDU 2795(+思考ツリーライン)

看板

制限時間:8000分の20000 MS(Javaの/その他)メモリの制限:32768分の32768 K(Javaの/その他)
の合計提出(S):32864受理提出(S):13090


問題の説明
大学への入り口、(hはその高さであり、wはその幅)wはサイズH *の大きな長方形の看板があります。最寄りのプログラミングコンテスト、ダイニングルームメニューの変更、およびその他の重要な情報:ボードは、すべての可能なアナウンスが掲載されている場所です。

9月1日、看板は空でした。一つ一つが、発表は看板の上に置かれて始まりました。

各発表は、ユニットの高さの紙のストライプです。より具体的には、i番目の発表は、サイズ1 *ウィスコンシンの長方形です。

誰かが看板に新しいお知らせを置くと、彼女はいつもの発表のための最上位の可能な位置を選ぶだろう。すべての可能な最上位のポジションの中で彼女は、常に左端のいずれかを選択します。

新発表のための有効な場所がない場合、それは(いくつかのプログラミングコンテストは、この大学からの参加者を持っていない理由です)看板の上に置かれていません。

看板やアナウンスの大きさを考えると、あなたのタスクは、アナウンスが置かれている行の番号を見つけることです。
 

 

入力
複数のケース(せいぜい40例)があります。

入力ファイルの最初の行は、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。
        ビルド(11 、H)。
        以下のためのint型 I = 1; iが<= N。++ I)
        { 
            int型LEN。
            scanf関数(" %のD "、およびLEN)。
            もし((合計1)> = LEN)
                (ASK 1 、LEN)を、
            のprintf(" -1 \ nを" ); 
        } 

    } 
}

 

おすすめ

転載: www.cnblogs.com/jrfr/p/11531877.html