HDU Pasando la pila monotónica de mensajes

  • Pasando el mensaje
  • El significado
    de la pregunta Dado un conjunto de números, encuentre la posición del número más grande a la izquierda (y derecha) números consecutivamente más pequeños de cada número.
  • Ideas
    Primero consideremos cómo encontrar la posición del número más grande entre los números consecutivamente más pequeños en su lado izquierdo. Esto usa una estructura de datos simple: pila monótona.
    Pila monótona: la pila monótona es en realidad una pila, pero usa algunos La lógica inteligente hace que los elementos de la pila permanezcan en orden (aumentando o disminuyendo monótonamente) cada vez que se inserta un nuevo elemento en la pila. Aquí vamos a usar una pila monótonamente decreciente (es decir, el subíndice desde la parte inferior de la pila hasta la parte superior de la pila está aumentando) Sí, pero los datos están disminuyendo) Por cierto, la pila aumenta monótonamente (el subíndice aumenta desde la parte inferior de la pila hasta la parte superior de la pila, pero los datos también aumentan).
    En términos de principio, después de leer el código, puedes probarlo con cuidado ~
#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;
const int MAX_N=5e4+7;
int T,N;
int hei[MAX_N],resl[MAX_N],resr[MAX_N];
stack<int>S;
int main()
{
    
    
//  freopen(".../.txt","w",stdout);
//  freopen(".../.txt","r",stdin);
	ios::sync_with_stdio(false);
	cin>>T;
	int i,j,k=0;
	while(T--){
    
    
		cin>>N;
		for(i=1;i<=N;i++){
    
    
			cin>>hei[i];
		}
		while(!S.empty())
		S.pop();
		for(i=1;i<=N;i++){
    
    
			resl[i]=0;
			while(!S.empty()&&hei[S.top()]<hei[i]){
    
    
				resl[i]=S.top();
				S.pop();
			}
			S.push(i);
		}	
		while(!S.empty())
		S.pop();
		for(i=N;i;i--){
    
    
			resr[i]=0;
			while(!S.empty()&&hei[S.top()]<hei[i]){
    
    
				resr[i]=S.top();
				S.pop();
			}
			S.push(i);
		}	
		cout<<"Case "<<++k<<":"<<endl;
		for(i=1;i<=N;i++){
    
    
			cout<<resl[i]<<' '<<resr[i]<<endl;
		}
	}
	return 0;
}

Supongo que te gusta

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