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 .