tema:
Para un histograma, encuentra la mayor área rectangular en el histograma. Por ejemplo, la siguiente altura de la imagen en el histograma de izquierda a derecha son 2, 1, 4, 5, 1, 3, 3, 1 que son de ancho, el rectángulo más grande está sombreada.
Entrada:
Que comprende una pluralidad de conjuntos de datos de entrada. Cada conjunto de datos se representa mediante un número entero n de pequeña histograma rectangular, se puede asumir que 1 <= n <= 100000. entonces el siguiente n enteros H1, ..., hn, que satisface 0 <= hi <= 1000000000. Estos histograma de izquierda a derecha de la representación digital de cada pequeño rectángulo de altura, la anchura de cada rectángulo pequeño es 1. Los datos de prueba a 0 al final.
Salida:
Para cada línea de la salida de datos de prueba representa una respuesta entero.
Ejemplo de entrada:
7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0
Salida de muestra:
8
4000
análisis Tema:
Requieren un área máxima rectangular en el histograma, de acuerdo con un área conocida del rectángulo a la altura de la fórmula premisa debe requerir la anchura del rectángulo, y el rectángulo en la altura histograma [l, r] sujeto a la sección de altura mínima, la anchura rectangular = l-r + 1. Entonces, la pregunta clave es cómo determinar el adecuado l, r como un rango.
-
Para hacer todo más grande del rectángulo, la altura a un mínimo se determina como r en l.
-
Del mismo modo, si se determina la altura del rectángulo, entonces el punto de extremo izquierdo debe ser más a la izquierda, a la derecha el punto correcto, la única posible área máxima de un rectángulo.
-
punto final izquierdo se puede determinar como el primer número pequeño de puntos a la izquierda altura a la misma.
-
Se puede determinar como el extremo derecho de este primer punto altura número correcto pequeña.
-
pila monótono de la pila a los elementos de la pila de pila monótona inferior.
• monótonamente creciente pila se encuentra a la izquierda / derecha el primer elemento es más grande que el elemento actual.
• pila monótonamente decreciente se encuentra a la izquierda / derecha el primer elemento es menor que el elemento actual.
Respectivamente monótonamente decreciente monótonamente creciente pila y se obtiene la pila en cada punto es alta alrededor del punto final.
WA muchas veces, debido a que el tipo de datos, la propiedad de altura en el intervalo 0 <= hi <= 1000000000, aunque no más allá de la gama de gama int hi, pero en la zona en el proceso de obtención y h (l-r + 1 ) multiplicado gama int estallar, será WA, que tiene que ser una operación de fuerte en el que la convierte tipo largo de largo, donde tengo la altura y área de convertir al tipo de largo tiempo. Formado larga correspondencia larga LLD Oh, no hay que olvidar (se me olvidó la adición de una desgracia WA)
código:
#include<iostream>
#include<stdio.h>
#include<stack>
using namespace std;
const int maxn=1e5+100;
long long L[maxn],R[maxn],w[maxn],a[maxn];
int n;
void solve()//找出各点右端点
{
stack<int> sa;
int l=1;int r=0;
for(int i=1;i<=n;i++)
{
while(sa.size()>0 &&a[sa.top()]>a[i] )//单调递减栈找出右边第一个比当前元素小的元素
{
R[sa.top()]=i-1;
sa.pop();
}
sa.push(i);
}
while(sa.size()>0)//单调栈里的元素赋区间最右端点
{
R[sa.top()]=n;
sa.pop();
}
}
void solve1()//找出各点左端点
{
stack<int> sa;
int l=1;int r=0;
//while(n--)
for(int i=n;i>=1;i--)
{
while(sa.size()>0 &&a[sa.top()]>a[i] )//单调递减栈找出左边第一个比当前元素小的元素
{
L[sa.top()]=i+1;
sa.pop();
}
sa.push(i);
}
while(sa.size()>0)//单调栈里的元素赋区间最左端点
{
L[sa.top()]=1;
sa.pop();
}
}
int main()
{
//int n;//直方图小矩形个数
while(scanf("%d",&n)!=EOF)
{
if(n==0)
{
return 0;
}
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
solve();
solve1();
long long ans=0;
for(int i=1;i<=n;i++)//计算面积
{
w[i]=a[i]*(R[i]-L[i]+1);
}
for(int i=1;i<=n;i++)//找出最大面积
{
if(w[i]>ans)
{
ans=w[i];
}
}
printf("%lld\n",ans);
}
return 0;
}