Seletiva IOI 2018 - Dia 1
Se você quiser se preparar para a OBI e seletiva, 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.
Clique aqui para conferir a prova na íntegra *A seletiva da OBI 2017 foi feita para a IOI 2018
Seleção
Comentário escrito por Murilo Maeda
Conhecimento prévio necessário:
Nesse problema há duas dificuldades principais: o tamanho grande da matriz, então não podemos nem percorrê-la nem mantê-la em uma matriz, e a forma desorganizada que os números aparecem na matriz, não há um padrão que nos permita concluir coisas sobre a posição e organização de números na matriz.
Para resolver o primeiro problema, basta simplesmente não mantermos a matriz. Vamos manter somente os vetores e
e quando precisarmos de um valor, só somamos os valores necessários de
e
.
Agora, vamos resolver o segundo problema.
Note que, como queremos encontrar os menores números, a posição deles na matriz não importa. Por isso, podemos ordenar os vetores
e
, do menor para o maior e formar a matriz
na qual
. Agora, temos duas propriedades dessa matriz: em uma mesma linha, se a percorrermos de
a
, os valores estarão dispostos em ordem não decrescente. O mesmo ocorre quando percorremos uma coluna de
a
.
A partir disso, vamos analizar o que acontece quando queremos saber quantos valores menores ou iguais a um determinado valor estão na matriz
. Note que, se encontrarmos em uma determinada linha
o índice
de modo que o valor
é o maior valor maior ou igual a
na linha
, nas linhas com índice menor que
, o maior valor maior ou igual a
vai estar em um índice maior ou igual a
, já que os valores em uma coluna e em uma linha estão em ordem não decrescente. Por isso, para um determinado número
, para descobrir quantos valores menores ou iguais a ele estão na matriz
, podemos simplesmente fazer o seguinte: passamos pela linha n e pegamos
e o somamos no número de valores menores ou iguais a
. Para uma linha
: a percorremos a partir do índice
enquanto os valores forem menores ou iguais a
. Paramos no índice
e somamos
no número de valores menores ou iguais a
.
Com isso, podemos calcular em quantos valores são menores ou iguais a
na matrisz
. Então, basta fazermos uma busca binária na resposta, tentando encontrar o valor que queremos. Fazemos isso chutando o número da resposta, checando quantos valores são menores ou iguais a ele em
e em seguida comparando esse resultado com
.
Clique aqui para conferir o código
Caminhos Mínimos
Comentário escrito por Enzo Dantas
Conhecimento prévio necessário:
Primeiramente, indagamos se, para um valor extremamente grande de ,
para todo vértice
. Isso aconteceria pois cada aresta teria peso aproximadamente igual e o Dijkstra viraria uma BFS. Se o Dijkstra tende a virar uma BFS com o aumento do
, imaginamos se essa propriedade é monotônica, ou seja, se a partir de um certo valor de
temos
para todo
, e abaixo dele a condição não é válida. Se isso fosse verdade, poderíamos fazer uma busca binária no
e teríamos a nossa resposta. Vamos então tentar provar que isso é verdade.
Defina como o menor caminho em arestas e
como o menor caminho em peso de arestas do vértice 1 até um vértice qualquer
. Assuma que
. Juntando os dois temos
. Logo, abaixo do valor
temos que
, e acima dele temos
, como queríamos demonstrar.