ヒストグラムは、共通のベースラインに整列矩形の配列からなる多角形です。長方形は同じ幅を持っていますが、異なる高さを有することができます。例えば、左示す高さ2、1、4、5、1、を有する長方形で構成されたヒストグラムの図3、3、1は長方形の幅単位で測定:
通常、ヒストグラムをするために使用され離散分布、例えば、テキストの文字の頻度を表します。長方形の順序、すなわち、その高さは、重要であることに注意してください。あまりにも、共通のベースラインに整列されるヒストグラムで最大の長方形の面積を計算します。右のショー描かヒストグラムの最大の整列長方形の図。
通常、ヒストグラムをするために使用され離散分布、例えば、テキストの文字の頻度を表します。長方形の順序、すなわち、その高さは、重要であることに注意してください。あまりにも、共通のベースラインに整列されるヒストグラムで最大の長方形の面積を計算します。右のショー描かヒストグラムの最大の整列長方形の図。
InputThe入力には、いくつかのテストケースが含まれています。各テストケースは、それがで構成された矩形の数を表す、整数nを用いてヒストグラムと開始を記述する。あなたは、0 <= HI <= 1000000000これらの数字は左から右にヒストグラムの矩形の高さを表す<= N <= 100000次に続くn個の整数はH1、...、HN、1というをとることができます注文。各矩形の幅は1 Aゼロ、1行指定ヒストグラムの最大の長方形の領域上の各テストケース出力case.OutputFor最後のテストのための入力を、以下です。この矩形が共通のベースline.Sample入力に整列されなければならないことを忘れないでください
7 2 1 4 5 1 3 3 4 1000~1000 1000~1000 0
サンプル出力
8は、 4000
アイデア:モノトーンボードのタイトルキュー、注意単調統計長をデキュー、14の代わりに12の新しい長さが長くなるとエンキュー(データ74562333のセットを提供します
typedefの長い 長いLL。 一対のtypedef <LL、LL> PLL。 const int型 MAXM = 1E5 + 5 。 INT BUF [MAXM]、Q [MAXM]、lenの[MAXM]。 INT メイン(){ IOS :: sync_with_stdio(偽)、cin.tie(0 )。 int型のn; 一方、(CIN >> N && N){ LL ANS = 0 。 用(INT iは= 1 ; I <= N ++ {I) CIN >> BUF [i]は、 LEN [i]は =1 ; } BUF [N + 1 ] = 0 ; INT、L = 0、R = - 1 、CNT。 ブールフラグ= 偽。 以下のために(INT iが= 1 ; I <= N + 1 ; ++ I){ CNT = 0。フラグ= 偽; 一方、(L <= R && BUF [Q [R]]> BUF [I]){ フラグ = 真。 CNT + = LEN [Q [R]]。 ANS = MAX(ANS、1LL * CNT * BUF [Q [R])。 R - ; } Q [ ++ R] = I。 もし(フラグ)LEN [I] = CNT + 1 。 } COUT << ANS << " \ n " 。 } 戻り 0 。 }
同じ重量のノードが存在するので注意が、厳密にデカルト木ではなく、長さaは、検索のメモリを使用して、彼自身の降下+(1)のポイントの数であるデカルト木も、行うために使用することができます、または意志のT
typedefの長い 長いLL。 一対のtypedef <LL、LL> PLL。 const int型 MAXM = 1E5 + 5 。 INT BUF [MAXM]、Q [MAXM]、左[MAXM]、右[MAXM]、長さ[MAXM]。 INT getlen(INT U){ 場合(長さ[U])戻り長[U]。 int型のlen = 1 ; もし(左[U])LEN + = getlen(左[U])。 もし(右[U])LEN + = getlen(右[U])。 戻り長[U] = LEN。 } int型のmain(){ IOS :: sync_with_stdio(偽)、cin.tie(0 ); int型のn; 一方、(CIN >> N && N){ LL ANS = 0 。 以下のために(INT iが= 1 ; I <= N; ++ I)は、左[I] =右[I] =長さ[I] = 0 ; 以下のために(INT iが= 1 ; I <= N; ++ I) CIN >> BUF [i]は、 int型のトップ= 0 ; 以下のために(INT iが= 1 ; I <= N; ++ i)が{ ながら(トップ&& BUF [Q [トップ]> BUF [I]){ 左[I] = Q [トップ]。 トップ - ; } であれば(上) 右[Q [トップ] = I。 Q [ ++トップ] = I。 } ため(INT iは= 1 ; I <= N; ++ I){ int型 LEN = 1 。 LEN = getlen(I)。 ANS = MAX(ANS、1LL * LEN * BUF [I])。 } coutの << ANS << "\ n " ; } 戻り 0 ; }