Tutorial
Soma de Prefixos
Técnica muito usada em problemas envolvendo somas em intervalos.
Introdução
Considere o seguinte problema:
Problema. Dado um array de inteiros , você deve processar queries da seguinte forma: “dados inteiros , , calcule a soma .”
Ou seja, o problema consiste em calcular a soma dos valores no intervalo do array.
Solução. Vamos calcular um array auxiliar
de tamanho . Em outras palavras,
Agora, a soma pode ser escrita como
Logo, as queries do problema podem ser respondidas em apenas calculando a diferença de dois elementos do array descrito acima. Esse array é chamado de “Soma de prefixos” (ou prefix sum).
Ideias
Soma de prefixos não precisa ser usada apenas para calcular a soma dos valores em um intervalo. Muitos problemas envolvendo somas em intervalos de um array podem ser simplificados se considerarmos o array de soma de prefixos, transformando um problema de somas de vários valores em um problema de diferença de dois valores.
A seguir alguns exemplos desse conceito.
Maior Soma de um intervalo
Problema. Dado um array , encontre a maior soma possível de um intervalo do array.
Após transformar o problema em soma de prefixos, queremos calcular o maior valor possível de com .
Basta iterar de a no array de soma de prefixos, mantendo o menor valor encontrado até agora, e calculando a diferença .
Contar intervalos com soma
Problema. Dado um array e um inteiro , calcule a quantidade de intervalos do array tais que a soma dos elementos é exatamente igual a .
Transformamos o problema em soma de prefixos, e basta contar a quantidade de pares tais que .
Podemos iterar pelo array de soma de prefixos da esquerda para a direita, mantendo a contagem de cada soma possível. Para cada posição , basta saber a quantidade de posições tais que até agora.