Comentário por Henrique Vianna
Conhecimento prévio necessário:
Nesse exercicio, dada uma lista de
dominós, deve-se computar para cada um quantos outros dominós ele derruba, seja diretamente ou indiretamente. Um dominó
atinge um outro dominó
de forma direta se, e somente se,
.
Intuitivamente, faz sentido calcularmos as respostas para cada um dos dominós em ordem decrescente (de
a
), uma vez que um dado dominó só pode afetar aqueles que estão para a sua direita. Para nos auxiliar nessa tarefa, faremos uso de uma stack chamada de ativos, que guardará os índices dos dominós ainda não derrubados. Ademais, seja
o número de dominós que o dominó
derruba. Então, tendo já calculado
para 
, se
.
Perceba que se o dominó atual derrubar um dado dominó
de ativos, então deve-se remover
da stack. Ao acabarmos de processarmos o dominó
, devemos inseri-lo em ativos e avançar para o dominó
. Perceba que, uma vez que inserimos e retiramos um dado dominó da nossa stack uma única vez, a complexidade de nosso algoritmo é
. Ao final, basta imprimirmos
para
.
