Solução Informática Avançado – Semana 62

por

Por Samyra Almeida

Para resolver esse problema é necessário conhecer sobre a estrutura de dados BIT (Binary Indexed Tree ou Árvore de Indexação Binária, em tradução livre) também conhecida como Árvore de Fenwink (Fenwick Tree) e sobre o Algoritmo de Mo (esse tutorial está em inglês).

Bem, essa questão é bem semelhante ao Algoritmo de Mo tradicional (quantas vezes um determinado número aparece em um intervalo de $$l$$ até $$r$$), só que como queremos saber quantos prédios são maiores a uma determinada altura $$y$$, utilizaremos uma BIT de frequência, onde a função $$upd(p,$$ $$val)$$ atualizará o intervalo $$1$$ até $$p$$ e a $$query(p)$$ consultará quantos prédios existem com a altura de $$p$$ até $$maxv$$ (maior altura possível que segundo o enunciado da questão é $$10⁶$$). Sendo assim ao adicionarmos um prédio $$t$$ ao intervalo iremos fazer $$upd(v[t],$$ $$1)$$ e ao removermos um prédio $$t$$ faremos $$upd(v[t],$$ $$-1)$$, vale lembrar que no vetor $$v[]$$ temos a altura de todos os prédios. E para consultar quantos prédios existem com altura maior que $$y$$ iremos fazer $$query(y+1)$$, a cada pergunta de Sufia iremos salvar a resposta do intervalo no vetor $$ans[]$$. Ao final no algoritmo basta imprimirmos o vetor $$ans[]$$.

Para maior compreensão, segue o código solução:

https://gist.github.com/samyravitoria/667ee8d6911c39c58cf16fe425b312e8