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.