Escrito por Caique Paiva
Conhecimentos Prévios Necessários
Suponha que a nossa sequência de bombons tem uma divisão boa , com , então, veja que também é uma solução válida, pois, como o MEX de é igual o de , então , também terá o mesmo MEX, pois esse intervalo vai conter todos os números de até e não vai conter . Portanto, provamos que, caso tenhamos uma divisão boa de tamanho , também temos uma divisão boa de tamanho . Em particular, fazendo essa operação de juntar várias vezes, conseguimos chegar em somente intervalos.
Agora, só precisamos ir atrás de intervalos tal que o MEX deles dois sejam o mesmo. Então, chame de um vetor de elementos, onde de até . Vamos ver como calcular ele.
Primeiro, seja um vetor que vai guardar quais elementos estão na nossa sequência (Ou seja, caso esteja na sequência, e caso contrário). Inicialize e para todo i. Então, façamos um for com indo até , e no passo , vamos calcular :
- Primeiro, veja que de até , então, para calcularmos , basta adicionarmos ao de i-1. Então, faça , e veja os seguintes casos:
- Se , significa que não foi adicionado ao vetor, então o mex de até continua sendo , logo,
- Caso contrário, então todos os elementos de até estão em até , faça , e faça o seguinte while:
- while(v[pref[i]] > 0) pref[i]++;
- Ou seja, enquanto pertencer a até , aumente . Isso vai achar qual é o mex de até .
Portanto, conseguimos calcular para todo em ! Para finalizar, chame de um vetor de elementos onde de até (Ele vai ser calculado quase da mesma maneira que pref). Então basta procurar algum tal que . Caso ele exista, imprima os inervalos e como resposta. Caso não exista, imprima -1. Complexidade final: .