Comentário NOIC OBI 2023 – Fase 2 – Programação Nível 2

OBI 2023 – Fase 2 – Programação Nível 2

Se você quiser se preparar para a OBI, não deixe de conferir o Roteiro de estudos de informática, e também a página de informática do NOIC, com todos nossos materiais

Para conferir a prova na integra:

Código de Compressão

Comentário por Murilo Maeda

Para esse problema basta manter em uma variável auxiliar $$k$$ qual é o número de caracteres na sequência de caracteres iguais atual. Se um caractere é igual ao anterior, fazemos $$k++$$. Se um caractere é diferente do anterior, imprimimos $$k$$ e depois o caractere anterior. Lembre-se de no final do código imprimir $$k$$ e o último caractere da string.

Clique aqui para conferir o código

Grupos de Trabalho

Comentário por Henrique Vianna

Para resolver esse problema, basta marcarmos em qual grupo cada um dos alunos está e depois passar pelas $$M + D$$ condições, checando se elas estão satisfeitas. Para cada condição do primeiro tipo, se os dois alunos estiverem em grupos diferentes, aumentamos a resposta em um. Da mesma forma, para cada condição do tipo dois, se os dois alunos estiverem no mesmo grupo, devemos adicionar um à resposta.

Clique aqui para conferir o código

Distintos

Comentário por Murilo Maeda

Conhecimento prévio necessário:

Para esse problema, vamos utilizar a técnica de two pointers. A variável $$l$$ representa o índice mais à esquerda do segmento atualmente considerado e a variável $$r$$ representa o índice mais à direita do intervalo atualmente considerado. Como os valores têm um limite, basta manter um vetor que guarda a frequência dos valores para saber se há valores repetidos. Se quando tentamos expandir o segmento para a direita encontrarmos um número que já está no nosso segmento, calculamos o tamanho do segmento atual e checamos se ele é a melhor resposta até agora. Depois disso, movemos o limite esquerdo para a direita até que o valor que tentamos adicionar só apareça uma vez. A resposta vai ser o maior tamanho obtido durante todo o processo.

Complexidade: Passamos por cada índice uma vez com cada ponteiro, então a complexidade é $$O(N)$$

Clique aqui para conferir o código

Barcos da Nlogônia

Comentário por Fernando Gonçalves

Conhecimento prévio necessário:

Para maximizar o mínimo peso no caminho entre quaisquer dois vértices, usamos uma maximum spanning tree, pois (como foi provado aqui) a árvore geradora máxima tem essa propriedade.

Agora que temos a MST, podemos fazer todas as operações nessa árvore. Para tanto, usamos uma sparse table: teremos uma $$dp_{v,k}$$, que guarda o antecessor de $$v$$ que está $$2^k$$ arestas acima, e uma $$dpMin_{v,k}$$, que guarda o mínimo dos pesos no caminho até $$dp_{v,k}$$. Mantendo essas duas estruturas, conseguimos usar o algoritmo de achar lca para calcular o mínimo peso no caminho entre os pares de vértices dados em complexidade de $$O(logN)$$.

No total, teremos complexidade: $$O(B*logB)$$ para achar a MST, $$O(N*logN)$$ para construir a sparse table e $$O(C*logN)$$ para responder às consultas.

Clique aqui para conferir o código