問題の意味
各建物は1であり、幅一定の高さ、最大の矩形領域の算出が存在であり、nは隣接する建物を与えます。
思考
各矩形の高さは、左端の構築のi番目のレコードに[i]はL [i]とR&LTで、高い建築物として使用され、右端の高いにも拡張することができる長方形の範囲の範囲にすることができます。
コード
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <キュー> 4 使用して 名前空間をSTD。 5 CONST INT MAXN = 100000 + 5 。 6 7 INT [MAXN]、L [MAXN]、R [MAXN]。 8 9 構造体ノード{ 10 のint 値、POS。 11 ブール 演算子 <(constのノード&RHS)のconst { 12 戻り値< rhs.value。 13 } 14 }。 15 16 INT メイン(){ 17 // freopenは( "in.txt"、 "R"、STDIN)。 18 INT N。 19 ながら(〜のscanf(" %d個"、&N)){ 20 のために(INT iは= 0、I <N; I ++)のscanf(" %dの"、および[I])。 21 22 PRIORITY_QUEUE <ノード> Q。 23 のために(INT iは= 0、I <N; I ++ ){ 24 ながら(!q.empty()){ 25 ノードs = q.top()。 26 であれば(s.value> [I]){ 27 R [s.pos] = I- 1 。 28 q.pop()。 29 } 30 そう であれば(s.value <= [I]){ 31 ブレーク。 32 } 33 } 34 ノードs。 35 s.value = A [i]は、 36 s.pos = I。 37 q.push(S); 38 } 39 一方、(!q.empty()){ 40 ノードs = q.top()。 41 q.pop()。 42 R [s.pos] = N- 1 ; 43 } 44 45 のために(INT I = N- 1、I> = 0 ; i-- ){ 46 ながら(!{q.empty()) 47 ノードs = q.top()。 48 であれば(s.value> [I]){ 49 L [s.pos] = I + 1 。 50 q.pop()。 51 } 52 そう であれば(s.value <= [I]){ 53 ブレーク。 54 } 55 } 56 ノードs。 57 s.value = A [i]は、 58 s.pos = I; 59 q.push(S); 60 } 61 ながら(!q.empty()){ 62 ノードs = q.top()。 63 q.pop(); 64 [s.pos] = L 0 。 65 } 66 67の int型の RES = - 1 ; 68 のために(INT iが= 0 ; iが<N; I ++ ){ 69の RES = MAX(RES、[I] *(R [i]は-l [I] + 1 ))。 70 } 71 のprintf(" %dの\ n " 、RES)。 72 } 73 リターン 0 。 74 }