CSP_training Semana5 Problema monótona problema (HDU-1506) Pila

La resolución de problemas Una pila monótona Semana5

Descripción de la arquitectura

No toda la estructura de pila conocido es una estructura de datos muy comunes en la biblioteca de C ++ STL también tiene un buen paquete de pila pila estructura, puede utilizar las siguientes llamadas de los estados

#include<stack>

Monótona apilar su nombre una estructura de pila monótona, mediante el mantenimiento de un incremento de arriba hacia abajo (decremento) la secuencia de datos, y realiza se determina el acceso al tamaño de datos de destino. En general, la pila monótona se utiliza principalmente para resolver para encontrar el rango mínimo y máximo global de un punto, por lo que el siguiente paso para resolver el problema. Véase el siguiente ejemplo:

Resumen del tema

narrativa 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.
leyenda

ENTRADA Y muestra de 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.
de entrada de la muestra:

7 2 1 4 5 1 3 3
4 1,000 1,000 1,000 1,000
0

SALIDA Y Salida de muestra

Para cada línea de la salida de datos de prueba representa una respuesta entero.
Ejemplo de salida

8
4000

Tema reexpresión y el hoyo

Relativamente claro significado de las preguntas, dada una secuencia de histograma, encontrar el rectángulo del tamaño máximo que puede ser alojado en el interior, pero no pozo poco profundo, por lo que la necesidad de analizar cuidadosamente el significado de las preguntas.

Ideas de resolución de problemas

Un pozo: legal definición de un bloque rectangular, se puede ver una vista esquemática de la navegación por tema, los bloques máximos legales de histograma rectangulares deben satisfacer el valor de la posición de los lados izquierdo y derecho de la baldosa del borde inferior de lo que es "sólo trunca rectangular" en.
El análisis anterior claramente definido, podemos pensar, la figura de una legítima grande rectangular x área de cómo encontrar?
Analizar la muestra combinada con la fórmula matemática básica se puede derivar como sigue:

S = y (x) x (x -x extensión que se extiende límite superior límite inferior)

El problema se convierte a obtener la extensión de cada sector y extender el límite inferior de x, es decir, el suman para obtener el valor mínimo de x como los límites superior e inferior de la serie continua. Conversión aquí, podemos usar un método fijo: pila monótona para resolver el problema.
He mencionado anteriormente:
pila monótono puede ser usado para resolver, X como máximo (mínimo) un continuo de alcance global. Monótono pila naturaleza monótona que podamos problema en la siguiente :( tres Ejemplo inferior de la pila a una tapa de pila auto-incremento de la pila)
1, espacio de pila - directamente en la pila
2, una pila y elemento no vacío a insertar o mayor top elemento - empuje
3, un elemento no vacío pila y para ser insertado es más pequeño que la parte superior de la pila - y pop el elemento superior se determina de nuevo hasta que la condición 2 y empuje. En este paso, es importante tener en otra operación, siendoComo una extensión del límite mínimo punto emergenteRecuerde que debe empujar la posición del elemento.
Siguiendo los pasos anteriores, el límite superior se puede extender a la derecha de cada punto, la secuencia de acceso inversión, puede obtener acceso a la izquierda de cada punto límite. Los pasos restantes pueden resolver fácilmente la violencia.
Ve aquí hay que pensar más, entonces te gusta los mismos bloggers tontas:
amor el título de Aquí Insertar imagen Descripción
esta es la razón?
Veamos hoyo dos: ver el valor en el título del tamaño de punto más grande es 1E9, int Normalmente puede mantenerse baja, pero no ignore que, calculamos esa zona, un solo ancho de un rectángulo cerca 1E9 longitud cerca 1E5, que dará lugar a una segunda fosa, int no es suficiente para mantener bajo el tamaño de la zona detrás de la zona fallará, resultando en fuera wa desinformados.
Modificaciones: Dafa es bueno a largo tiempo, mucho tiempo para alejarse

resumen

título general no es difícil, sobre todo en el modelo de pila monótona si familiar, pero el pozo es muy fácil de gatillo, después de ver los datos de valores deben ser conscientes alcanzó 1E9 no será porque más allá del alcance de los cables de operación para resolver un error!
monótona pila tiene aplicaciones en muchos problemas similares, siempre y cuando la palabra clave determinada tiene la siguiente varios:
situación general
El alcance máximo con un valor mínimo de x
dejó x (a la derecha) la primera es mayor que (menor que) el valor de x
pila monótona a menudo puede ser una buena solución al problema!

título de la fuente

#include<iostream>
#include<stdio.h>
#include<stack>
#include<algorithm>
using namespace std;
long long n;
long long a[100010];long long L[100010];long long R[100010];
stack<int> s;
//对于i来说
//L:i能向左边延伸的最靠左的位置 
//L[n]  等于他左边第一个比他小的位置-1
//R: i能向右边延伸的最靠右的位置
//R[n]  等于他右边第一个比他小的位置+1
/*模拟一个例子:
[3 1 2 4 0]
[3]
[3 1]
[1] R[1]=2-1
[1 2]
[1 2 4]
[1 2 4 0]
[1 2 0] R[4]=5-1=4
[1 0]  R[3]=5-1=4
[0 ] R[2]=5-1=4
R[5]=5
*/
void solve1()
{
    for(int i=1;i<=n;i++)
    {
    	if(s.empty())
    	s.push(i);
    	else
    	{
        	if(a[s.top()]<=a[i])
            s.push(i);
            else
            {
            	while(a[s.top()]>a[i])
        		{
            		R[s.top()]=i-1;
            		s.pop();
            		if(s.empty())
            		break;
        		}
        		s.push(i);
			}
    	}
    }
    while(!s.empty())
    {
        R[s.top()]=n;
        s.pop();
    }
}
void solve2()
{
    for(int i=n;i>=1;i--)
    {
    	if(s.empty())
    	s.push(i);
    	else
    	{
        	if(a[s.top()]<=a[i])
            s.push(i);
            else
            {
            	while(a[s.top()]>a[i])
        		{
            		L[s.top()]=i+1;
            		s.pop();
            		if(s.empty())
            		break;
        		}
        		s.push(i);
			}
    	}
    }
    while(!s.empty())
    {
        L[s.top()]=1;
        s.pop();
    }
}
int main()
{
	scanf("%lld",&n);
    while(n!=0)
    {
    	for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
    }  
    solve1();
    solve2();
    long long ans=0;
    for(int i=1;i<=n;i++)
	{
		ans=max(ans,a[i]*(R[i]-L[i]+1));
	 }
    printf("%lld\n",ans);
    scanf("%lld",&n);
	}
    return 0;
}
Publicado 17 artículos originales · ganado elogios 2 · Vistas 1658

Supongo que te gusta

Origin blog.csdn.net/qq_43942251/article/details/105128511
Recomendado
Clasificación