Escrito por Caique Paiva
Conhecimentos Prévios Necessários:
- DP em Árvore
- Decomposição em Raiz
Esse problema tem muitas soluções. A mais rápida que eu conheço é em , mas ela é bem complicada. Vou apresentar uma mais simples, que é em
, e como o tl do problema é de 7 segundos, com uma implementação boa, ela passa.
- Como resolver com
fixo?
Vamos calcular isso com uma dp! Seja um par de números: { A quantidade de caminhos de tamanho
na subárvore de
, O tamanho do maior caminho que começa por
e passa somente por vértices que não foram escolhidos em um caminho ainda }. Feito isso, como vai ser a transição?
Seja um filho de
. Temos que
Pois todo caminho de tamanho escolhido na subárvore de
também pertence a subárvore de
.
Agora, para , temos duas possibilidades.
- Seja
dois filhos tal que
é máximo e
é o segundo maior. Temos que, caso
, então, faça
, pois caso isso seja verdade, podemos criar outro caminho de tamanho
, e então, faça
.
- Caso isso não aconteça, faça
, pois esse é o maior caminho que podemos criar.
No final, basta retornar , e isso vai ser nossa resposta!
Conseguimos resolver o fixo em
!! Só temos um problema, se rodarmos esse código para cada
, temos um código
, que não passa :(, como podemos otimizar? Seja
a resposta para um certo
.
- Lema:
Isso é verdade pois cada vértice pertence a no máximo 1 caminho e cada caminho tem vértices, então, se tivermos mais que
caminhos, vamos ter que ter usado mais que
vértices, o que é um absurdo. Esse lema acaba o problema! Pois isso implica que vamos ter no máximo
valores distintos de
! Pois, caso
, então
, ou seja, de
, temos no máximo
valores, e entre
, obviamente temos
valores no máximo. Agora, veja que
, portanto, a ideia vai ser o seguinte algoritmo, começando com
:
- Primeiro, calculamos
, e agora, vamos fazer uma busca binaria para achar o último
tal que
, então, vamos ter que
. Então, em
, conseguimos achar esse
, e fazemos
.
Agora, como temos no máximo valores diferentes, esse algoritmo só vai ser aplicado
vezes, então, a complexidade no final fica
.