HDU 1506 Rectángulo más grande en una pila monótona de histograma

  • Significado de la pregunta
    Encuentre el área del rectángulo más grande en el histograma
  • Idea
    Esta pregunta es similar a Pasar el mensaje (use la pila monótonamente decreciente para mantener el valor mínimo del intervalo para actualizar gradualmente la respuesta.
    Esta pregunta es usar la pila monótonamente creciente para mantener el valor máximo del intervalo para actualizar gradualmente la respuesta, y use resl [i] para registrar que el lado izquierdo es mayor que hei [i] ( El subíndice más pequeño que contiene el valor igual a). Al pasar a hei [i], si el elemento en la parte superior de la pila es mayor que hei [i], actualice el valor de res [Q.top ()] a resl [i], y luego Salir de la pila, si el valor en la parte superior de la pila es menor que hei [i], se inserta directamente en la pila. Luego se calcula la matriz resr []. Resr [i] almacena el subíndice más grande del valor mayor que él en el lado derecho de i.
  • Código
#pragma GCC optimize(2)
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef unsigned long ul;
typedef unsigned long long ull;
#define pi acos(-1.0)
#define e exp(1.0)
#define pb push_back
#define mk make_pair
#define fir first
#define sec second
#define scf scanf
#define prf printf
typedef pair<ll,ll> pa;
const ll INF=0x3f3f3f3f3f3f3f3f;
string S;
const ll MAX_N=1e5+7;
ll N,hei[MAX_N],resl[MAX_N],resr[MAX_N];
stack<ll>Q;
int main()
{
    
    
//  freopen(".../.txt","w",stdout);
//  freopen(".../.txt","r",stdin);
	ios::sync_with_stdio(false);
	ll i,j,k;
	while((cin>>N)&&N){
    
    
//		getline(cin,S)
//		if(S[0]=='0'&&S.length()==1){
    
    
//			break;
//		}
//		stringstream ss(S);
//		N=0;
//		while(!ss.fail()){
    
    
//			ss>>hei[++N];
//		}
//		ss.clear();
//		--N;
		//维护递增栈 
		for(i=1;i<=N;i++)
		cin>>hei[i]; 
		while(!Q.empty())
		Q.pop();
		for(i=1;i<=N;i++){
    
    
			resl[i]=i;
			while(!Q.empty()&&hei[Q.top()]>=hei[i]){
    
    
				resl[i]=resl[Q.top()];
				Q.pop();
			} 
			Q.push(i);
		}
		while(!Q.empty())
		Q.pop();
		for(i=N;i;i--){
    
    
			resr[i]=i;
			while(!Q.empty()&&hei[Q.top()]>=hei[i]){
    
    
				resr[i]=resr[Q.top()];
				Q.pop();
			} 
			Q.push(i);
		}
		ll maxx=0;
		for(i=1;i<=N;i++){
    
    
			maxx=max(maxx,hei[i]*(resr[i]-resl[i]+1));
//			cout<<resl[i]<<' '<<resr[i]<<endl;
		}
		cout<<maxx<<endl; 
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43311695/article/details/108746027
Recomendado
Clasificación