█████████ ████ ███░░░░░███ ░░███ ███ ░░░ ██████ ███████ ██████ ██████ ░███ ███░░███ ███░░███ ███░░███ ███░░███ ░███ ░███ ░███░███ ░███ ░███████ ░███ ░███ ░░███ ███░███ ░███░███ ░███ ░███░░░ ░███ ░███ ░░█████████ ░░██████ ░░████████░░██████ ░░██████ ░░░░░░░░░ ░░░░░░ ░░░░░░░░ ░░░░░░ ░░░░░░

Envío 5895

Problema 0x50 - Rectángulo de máxima área dentro de un histograma enorme

  • Autor: nivalderramas
  • Fecha: 2022-03-24 17:02:18 UTC (Hace alrededor de 2 años)
Caso # Resultado Tiempo Memoria
#1
Correcto
0.001 s 0 KBi
#2
Correcto
0.002 s 0 KBi
#3
Correcto
0.002 s 0 KBi
#4
Correcto
0.006 s 32 KBi
#5
Correcto
0.002 s 0 KBi
#6
Correcto
0.002 s 0 KBi
#7
Correcto
0.005 s 57 KBi
#8
Correcto
0.001 s 0 KBi
#9
Correcto
0.001 s 0 KBi
#10
Correcto
0.002 s 0 KBi
#11
Incorrecto
0.002 s 0 KBi
#12
Incorrecto
0.005 s 34 KBi
#13
Correcto
0.002 s 0 KBi
#14
Correcto
0.032 s 3 KBi
#15
Incorrecto
0.03 s 3 KBi
#16
Incorrecto
0.027 s 3 KBi
#17
Incorrecto
0.038 s 3 KBi
#18
Correcto
0.062 s 42 KBi
#19
Correcto
0.018 s 3 KBi
#20
Correcto
0.029 s 3 KBi
#21
Incorrecto
0.031 s 3 KBi
#22
Incorrecto
0.046 s 3 KBi
#23
Incorrecto
0.104 s 70 KBi
#24
Correcto
0.018 s 3 KBi
#25
Correcto
0.018 s 3 KBi
#26
Incorrecto
0.043 s 3 KBi
#27
Correcto
0.073 s 3 KBi
#28
Correcto
0.059 s 11 KBi
#29
Incorrecto
0.081 s 3 KBi
Puntos totales: 66 / 100

Código

#include <bits/stdc++.h>
#define REP(i,n) for(int i=0; i<n;i++)
#define pb push_back
#define ff first
#define ss second
#include <assert.h>
#define ii pair<int,int>
#define vii vector<ii>
#define lli long long int
#define vi vector<lli>
using namespace std;
ostream& operator<<(ostream& os, const vector<lli> &v){
    for(auto const &i: v){
        os<<i<<" ";
    }
    os<<endl;
    return os;
}


int main(){
	lli n; cin>>n;
	vi a(n);
	for(int i = 0; i<n; i++){
		cin>>a[i];
	}
	stack<lli> q; //left to right
	vi lef(n,0);
	for(int i = 0; i<n; i++){
        while(q.size() > 0 && a[q.top()] >= a[i]){
            q.pop();
        }
        lef[i] = (q.size() ? q.top() +1 : 0);
        q.push(i);
	}
	while(q.size())q.pop();
	vi rai(n,n);
	for(int i = n-1; i>=0; i--){
        while(q.size() > 0 && a[q.top()] >= a[i]){
            q.pop();
        }
        rai[i] = (q.size() ? q.top() - 1 : n-1);
        q.push(i);
	}
	lli ans = 0;
	for(int i = 0; i<n; i++){
        ans = max(ans,(abs(i-lef[i])+1)*a[i]);
        ans = max(ans,(abs(i-rai[i])+1)*a[i]);
	}
	cout<<ans<<endl;
	return 0;
}