Aula por Caique Paiva
Conhecimento prévio necessário:
O intuito dessa aula é resolver o seguinte problema:
Dado uma sequência , ache o tamanho da maior subsequência crescente de
.
Por exemplo, na sequência , a maior subsequência crescente é
, logo a resposta é
. Vamos fazer
e
para todo
.
Vamos achar um algoritmo que roda em com uma dp, e a melhor parte desse algoritmo é que podemos aplicar a mesma ideia para outros problemas.
A dp será a seguinte: Defina como para ser a maior subsequênca crescente no qual último valor dessa subsequência é
. A ideia do problema é começar a calcular essa dp no intervalo
, e depois passar para o intervalo
, depois para o intervalo
, e ir até o intervalo
.
Com isso, suponha que calculamos essa dp para o intervalo , então, vamos calcular ela para o intervalo
. Primeiro, veja que o único valor da dp que nós vamos mudar é o de
, pois as outras subsequências (Ou seja, as que não terminam em
) estão inclusas em
. Com isso, vamos atualizar
.
Com isso, para toda subsequência crescente que acaba em um número , então, se incluirmos o
nela, conseguimos uma subsequência crescente que acaba em
, e ela vai ter tamanho máximo de
! Além disso, se
, não podemos incluir
na subsequência, ou seja, não contamos esse caso na dp. Portanto, a fórmula para calcular essa transição vai ser
Porém, temos dois problemas nessa solução, mas eles são tranquilos de resolver:
- Primeiro é o fato de que
. Isso é um problema, pois precisamos criar um vetor para
de tamanho
, que pode ser igual a
, resultando num MLE. Para resolver isso, basta fazer uma compressão de coordenadas, fazendo
.
- O segundo problema é que, para calcular
, fazemos um algoritmo em
, ou seja, calcular essa dp é em
. Para resolver isso, basta ver que, se fizermos uma segtree de máximo, e então, em cada passo, calculamos a query de
, e fazemos o update de
como descrito acima, e então, a transição fica
.
Com isso, achamos o algoritmo em .