"Algorithm Competition Advanced Guide" Problème d'exemple de pile 0x11 Le plus grand rectangle d'un histogramme

Le plus grand rectangle d'un histogramme

Point de connaissance: pile monotone (premier regard sur le livre bleu P54)

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n,tt;
ll stk[N],h[N],l[N],r[N];
int main()
{
    
    
    while(cin>>n)
    {
    
    
        if(n==0)break;
        memset(l,0,sizeof l);
        memset(r,0,sizeof r);
        for(int i=1;i<=n;i++)cin>>h[i];
        h[0]=h[n+1]=-1;//帮助清空栈
        tt=-1;
        stk[++tt]=0;
        for(int i=1;i<=n;i++)
        {
    
    
            while(h[stk[tt]]>=h[i])tt--;
            l[i]=i-stk[tt];
            stk[++tt]=i;
        }
        tt=-1;
        stk[++tt]=n+1;
        for(int i=n;i>=1;i--)
        {
    
    
            while(h[stk[tt]]>=h[i])tt--;
            r[i]=stk[tt]-i;
            stk[++tt]=i;
        }
        ll ans=0;
        for(int i=1;i<=n;i++)
        {
    
    
            ans=max(ans,h[i]*(r[i]+l[i]-1));
        }
        cout<<ans<<endl;
    }
    return 0;
}

une analyse:

Idées de pratiques violentes:

Prenez la hauteur h [i] de chaque rectangle comme hauteur du rectangle final, puis demandez aux deux côtés jusqu'à ce qu'elle soit inférieure à la hauteur du rectangle (c'est-à-dire que h [i] ne peut pas être étendu comme hauteur)

Optimisation de la pile monotone

Il suffit de connaître le numéro du premier rectangle inférieur à h [i] obtenu en demandant à gauche avec le i-ème rectangle comme centre et le numéro du premier rectangle inférieur à h [i] obtenu en posant la question à droite pour déterminer le final La largeur du rectangle. Pour les rectangles du milieu, on peut simplement les ignorer, c'est-à-dire qu'il suffit de maintenir une séquence monotone.

Lorsque nous demandons du point D vers la gauche, B est le premier inférieur à D, nous pouvons donc éliminer C (c'est-à-dire maintenir ABD en augmentation monotone).
Insérez la description de l'image ici
Lorsque nous demandons du point F vers la droite, le point J est le premier Is inférieur à F, donc GH peut être éliminé. Nous maintenons l'intervalle JF croissant monotone. De même, lorsque nous partons du point D et demandons vers la droite, nous devons maintenir la séquence croissante monotone JFD (c'est-à-dire notre pile monotone)
Insérez la description de l'image ici

Pour la pile, les informations que nous valorisons sont le haut de la pile. Commencez à demander directement à partir du point D. À ce stade, le haut de la pile de notre pile monotone est F. Ensuite, nous pouvons savoir que le rectangle D dérivé de la droite vers F ne peut pas être développé.

Étapes de mise en œuvre

Prenons l'exemple de demander à gauche

1. Déterminez ce que nous voulons: le
numéro du premier rectangle plus court que h [i]
2. D'où vient ce nombre:
du haut de la pile monotone
3. Quel type de pile monotone voulons-nous maintenir, et pourquoi :
maintenir Une pile monotone à croissance monotone, car de cette façon nous nous assurons que celui à ajouter à la pile (c'est-à-dire le i-ème rectangle qui interroge actuellement) est plus haut que le rectangle en haut de la pile, que c'est-à-dire, avant de rejoindre, le haut de cette pile monotone est nous Valeur désirée
4. Comment maintenir une pile monotone croissante:
Si le rectangle courant est plus haut que le rectangle supérieur de la pile, poussez-le directement
dans la pile, sinon gardez retirer le haut de la pile jusqu'à ce que la pile soit vide ou que la hauteur du rectangle supérieur soit plus petite que le rectangle actuel

Insérez la description de l'image ici
Demandez le droit pour la même raison, ou maintenez une pile croissante de manière monotone et traversez vers l'arrière.

Quelques idées

En écrivant des mots comme "le premier nombre plus petit que la valeur courante", je pense naturellement à la dichotomie. Ensuite, la monotonie de la pile monotone peut aussi être abstraite en satisfaisant certaines conditions et ne satisfaisant pas certaines conditions, puis les deux Quelle est la différence?

Je suppose que tu aimes

Origine blog.csdn.net/qq_39354847/article/details/112963451
conseillé
Classement