El significado de los problemas
Proporciona a los edificios de N adyacente, cada edificio tiene una cierta altura, la anchura son 1, la mayor existen cálculo de área rectangular.
pensamiento
La altura de cada rectángulo se puede utilizar como la construcción de alto, con L [i] y R ^ [i] en el i-ésimo registro de la construcción de la más a la izquierda y más a la derecha cubre la gama rectangular que puede ser extendido a un alto.
código
1 #include <iostream> 2 #include <cstdio> 3 #include <cola> 4 usando espacio de nombres std; 5 const int maxN = 100000 + 5 ; 6 7 int un [maxN], l [maxN], r [maxN]; 8 9 struct nodo { 10 int valor, pos; 11 bool operador <( const nodo y rhs) const { 12 de retorno valor < rhs.value; 13 } 14 }; 15 16 int main () { 17 // freopen ( "in.txt", "r", la entrada estándar); 18 int n; 19 , mientras que (~ scanf ( " % d " , y n)) { 20 para ( int i = 0 ; i <n; i ++) scanf ( " % d " , & a [i]); 21 22 priority_queue <nodo> q; 23 para ( int i = 0 ; i <n; i ++ ) { 24 mientras que (! Q.empty ()) { 25 nodo s = q.top (); 26 Si (s.value> a [i]) { 27 r [S.POS] = i- 1 ; 28 q.pop (); 29 } 30 más si (s.value <= a [i]) { 31 descanso ; 32 } 33 } 34 nodo s; 35 s.value = a [i]; 36 S.POS = i; 37 q.push (s); 38 } 39 mientras que (! q.empty ()) { 40 nodo s = q.top (); 41 q.pop (); 42 r [S.POS] = n- 1 ; 43 } 44 45 para ( int i = n- 1 ; i> = 0 ; i-- ) { 46 mientras que (! {Q.empty ()) 47 de nodo s = q.top (); 48 Si (s.value> a [i]) { 49 l [S.POS] = i + 1 ; 50 q.pop (); 51 } 52 más si (s.value <= a [i]) { 53 descanso ; 54 } 55 } 56 nodo s; 57 s.value = a [i]; 58 S.POS = i; 59 q.push (s); 60 } 61 mientras que (! Q.empty ()) { 62 nodo s = q.top (); 63 q.pop (); 64 l [S.POS] = 0 ; 65 } 66 67 int res = - 1 ; 68 para ( int i = 0 ; i <n; i ++ ) { 69 res = max (res, a [i] * (r [i] -l [i] + 1 )); 70 } 71 printf ( " % d \ n " , res); 72 } 73 de retorno 0 ; 74 }