CSP_training Semaine5 problema (HDU-1506) problème Stack monotones

Une résolution de problème monotone pile Semaine5

Présentation de l'architecture

Ne toute la structure de pile connue est une structure de données très courantes dans la bibliothèque C ++ STL a aussi une bonne pile de structure de pile de paquets, vous pouvez utiliser les appels suivants déclaration

#include<stack>

Monotones empiler son nom, une structure de pile monotone, en maintenant un incrément de haut en bas (décrémentation) la séquence de données, et effectue l'accès à la taille de données cible est déterminée. En général, la pile monotone est principalement utilisé pour résoudre pour trouver la gamme minimum et maximum global d'un point, la prochaine étape pour résoudre le problème. Voir l'exemple ci-dessous:

Vue d'ensemble du sujet

récit sujet

Pour un histogramme, trouver la plus grande zone rectangulaire dans l'histogramme. Par exemple, la hauteur de l'image dans l'histogramme de gauche à droite sont 2, 1, 4, 5, 1, 3, 3, 1, ils sont larges, le plus grand rectangle est ombré.
légende

ENTRÉE INPUT ÉCHANTILLONS

Comprenant une pluralité d'ensembles de données d'entrée. Chaque ensemble de données est représenté par un nombre entier n de petit histogramme rectangulaire, on peut supposer que 1 <= n <= 100000. alors le suivant des nombres entiers n h1, ..., hn, satisfaisant 0 <= salut <= 1000000000. Ces histogramme de gauche à droite de la représentation numérique de chaque petit rectangle de hauteur, la largeur de chaque petit rectangle est égal à 1. Les données d'essai à 0 à la fin.
entrée de l' échantillon:

2 1 4 7 5 1 3 3
4 1000 1000 1000 1000
0

SORTIE et Exemple de sortie

Pour chaque ligne de la sortie de données de test représente un nombre entier de réponse.
Exemple de sortie

8
4000

retraitement du sujet et de la fosse

sens relativement clair des questions, étant donné une séquence d'histogramme, trouver la taille maximale du rectangle qui peut être logé à l'intérieur, mais pas fosse peu profonde, donc la nécessité d'analyser soigneusement la signification des questions.

idées de résolution de problèmes

Une fosse: définition légale d'un bloc rectangulaire, on peut voir une vue schématique de la navigation du sujet, les Histogramme blocs rectangulaires juridiques maximales devraient satisfaire la valeur de la position des côtés gauche et droit de la tuile de frontière moins qu'il est « juste tronquée rectangulaire » dans.
L'analyse ci - dessus clairement définie, on peut penser, la figure d'une plus grande surface rectangulaire légitime x comment trouver?
Analyser l'échantillon combiné avec la formule mathématique de base peut être calculée comme suit:

S = y (x) x (x -x prolongement prolongeant la limite inférieure limite supérieure)

Le problème est converti pour obtenir l'extension de chaque secteur et étendre la limite inférieure de x, à savoir la additionnées pour obtenir la valeur minimum de x que les limites supérieure et inférieure du continuum. Conversion ici, nous pouvons utiliser une méthode fixe: pile monotone pour résoudre le problème.
Je l' ai mentionné précédemment:
pile Monotone peut être utilisé pour résoudre, x au maximum (minimum) un continuum de portée mondiale. Monotone pile de nature monotone nous pouvons problème dans les trois suivants :( Exemple bas de la pile à une pile d' auto-incrémentation sommet de la pile)
1, l' espace de pile - directement sur la pile
2, une pile non vide et l' élément à insérer ou plus élément supérieur - poussoir
3, un élément de pile non vide et à être introduit est plus petit que le sommet de la pile - et pop l'élément de sommet est déterminé à nouveau jusqu'à ce que la condition 2 et pousser. Dans cette étape, il est important d' une autre opération, êtreDans le prolongement du point pop-up limite minimumRappelez - vous de pousser la position de l' élément.
En suivant les étapes ci - dessus, la limite supérieure peut être étendue au droit de chaque point, l' inversion de la séquence d'accès peut accéder à la gauche de chaque point de limite. Les étapes restantes peuvent facilement résoudre la violence.
Voir ici , vous devez réfléchir, alors vous aimerez les mêmes blogueurs stupides: l'
amour le titre de Insérer ici l'image Description
c'est pourquoi?
Regardons deux stands: voir la valeur dans le titre de la plus grande taille du point est 1e9, Normalement int peut être maintenue vers le bas, mais ne négligez pas, nous calculons cette zone, une seule largeur d'un rectangle 1E9 Fermer longueur proche 1e5, il déclenchera une deuxième fosse, int ne suffit pas pour maintenir réduire la taille de la zone située derrière la zone échouera, ce qui hors mal informés wa.
Modifications: Dafa est bon à long long, long longtemps pour sortir

résumé

Titre de l' ensemble est pas difficile, principalement sur la pile monotone modèle si familier, mais la fosse est vraiment facile à déclencher, après avoir vu les valeurs données doivent être au courant atteint 1E9 ne sera pas parce qu'au - delà de la portée des pistes de fonctionnement pour résoudre une erreur!
pile monotones a des applications dans de nombreux problèmes similaires, aussi longtemps que le mot - clé donné a plusieurs éléments suivants:
Situation générale
La portée maximale avec une valeur minimale de x
gauche x (à droite) , le premier est supérieur (inférieur) la valeur de x
de la pile monotone peut souvent être une bonne solution au problème!

title Source

#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;
}
Publié 17 articles originaux · louange gagné 2 · Vues 1658

Je suppose que tu aimes

Origine blog.csdn.net/qq_43942251/article/details/105128511
conseillé
Classement