Solução Informática Avançado - Semana 39

Para essa questão vamos considerar o seguinte problema: Para cada valor devemos encontrar o primeiro valor a esquerda dele que é estritamente maior que ele.

Podemos fazer isso com a ajuda de uma stack, estrutura do C++. Vamos passar pela lista da esquerda para a direita, e para cada elemento retiramos todos os elementos menores ou iguais a ele da stack, e após isso colocamos ele to noto. Com isso mantemos uma stack que é estritamente crescente, e com isso o valor no topo da stack após removermos os elementos menores ou iguais será o primeiro elemento que bloqueia sua visão. Também devemos considerar o caso de quando a stack está vazia, em que não tem ninguém que bloqueia sua visão.

Código para melhor entendimento:


#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000010;
int v[maxn];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
stack<int> s;
for (int i = 0; i < n; i++) {
cin >> v[i];
while (s.size() > 0 and v[s.top()] <= v[i]) s.pop();
int ans = 0;
if (s.empty()) ans = i;
else ans = i-s.top();
cout << ans << " ";
s.push(i);
}
cout << "\n";
return 0;
}

view raw

torres.cpp

hosted with ❤ by GitHub