Guia de Estudos - Informática

Escrito por Lúcio Cardoso

Como estudar para olimpíadas de informática?

Quando se trata de olimpíadas científicas, como se preparar para tais competições não possui uma resposta simples. Este guia busca responder a pergunta acima da maneira mais abrangente possível, indicando diversas fontes de materiais e problemas.

Assuntos ou Problemas - O que priorizar?

Afinal, o que é melhor: aprender vários algoritmos e estruturas de dados variados ou focar em resolver problemas de diferentes tópicos?

O melhor é balancear os dois, com um foco maior em resolver problemas com dificuldade um pouco acima da sua zona de conforto. Por balancear os dois, queremos dizer que apenas aprender vários assuntos de diferentes tópicos não é suficiente para obter-se um bom desempenho em olimpíadas. Por outro lado, por vezes é bastante difícil resolver um problema sem o background necessário em algum tópico.

Por isso, recomendamos aprender todos os algoritmos e ideias básicas das grandes áreas de olimpíadas (grafos, programação dinâmica, estruturas de dados, matemática e geometria computacional), de acordo com seu nível. Para isso, a ementa da OBI é um bom guia. Busque aprender todos os assuntos necessários do seu nível, sempre fazendo vários problemas de cada um. Assim que se sentir confiante em um assunto, continue para o próximo.

Resolver muitos problemas de maneira consistente é chave para crescimento olímpico. Por isso, recomendamos que sempre confira os Problemas da Semana do Noic, pois buscamos sempre disponibilizar problemas de boa qualidade com ideias interessantes. Além disso, os judges que citaremos abaixo são boas fontes de problemas.

De modo resumido: Uma boa base combinada com vários problemas é sempre melhor do que apenas aprender assuntos diversos.

Durante quanto tempo devo pensar em um problema?

Em alguns casos, pensar em um problema por bastante tempo, mesmo ao se sentir "empacado" ou sem ideias, é uma ótima maneira de evoluir e melhorar as suas habilidades. Ao mesmo tempo, em outras situações, gastar dias em um problema não é uma estratégia eficiente.

Infelizmente, não há uma quantidade fixa de horas para se pensar em um problema que funcione para todas as pessoas ou todos os problemas. Por isso, o que recomendamos é que não desista rapidamente de um problema, mesmo quando não estiver conseguindo fazer um progesso considerável.

Caso você decida que pensou o suficiente em um problema (esse número pode variar de horas a até mesmo dias), e mesmo assim não conseguiu resolvê-lo, procure por uma solução e faça questão de entendê-la com muito cuidado. Frequentemente, problemas diferentes podem compartilhar ideias semelhantes, e por esta razão, é extremamente importante entender a solução de cada problema resolvido a fundo.

Como escolher a dificuldade dos problemas?

Em geral, procure resolver problemas que estão um um pouco acima do seu nível de conforto. Resolver problemas que sejam muito fáceis para você não irão lhe dar retorno algum, e o mesmo vale para tentar resolver problemas muito acima do seu nível.

Como nem sempre é fácil encontrar problemas no nível ideal para você, recomendamos, novamente, a seção de Problemas da Semana, que busca disponibilizar problemas no nível certo para você, seja esse nível iniciante, intermediário ou avançado.

Sites recomendados

  • Codeforces: Este site é um dos mais famosos judges de problemas, usado mundialmente por competidores dos mais diversos níveis. O site possui contests (competições) toda semana, e além disso, possui um banco gigante de problemas (o problemset), que podem ser separados por dificuldade e, também, por tópico. Recomendamos fortemente a sua participação em contests do Codeforces e, também, o uso do seu problemset. Infelizmente, o site se encontra apenas no inglês e no russo.
  • DMOJ: O DMOJ é um judge canadense, que possui problemas próprios e, também, problemas de olimpíadas internacionais. Os problemas são, em geral, de alta qualidade e é possível separá-los por tópico e dificuldade. Recomendamos as seguintes dificuldades: 1 a 10 pontos para iniciantes, 10 a 15 pontos para intermediários e 15 acima para avançados. Infelizmente, o site se encontra apenas no inglês.
  • CSES: Site com problemas de diversos tópicos (podem ser encontrados na seção "Problem Set"). Recomendamos, em específico, a seção de "Additional Problems" (problemas adicionais), pois são problemas, em geral, "clássicos" e de dificuldade maior. Infelizmente, o site só se encontra em inglês.
  • SPOJ e SPOJ BR: Judges muito famosos com uma grande quantidade de problemas. O SPOJ BR inclui problemas de competições como Seletivas para a Maratona de Programação e Seletivas da IOI antigas.
  • Neps Academy: O Neps Academy é um site brasileiro, que possui tanto cursos de programação como problemas de várias fontes, como a OBI e a Maratona de Programação. É um dos únicos judges que possui problemas da Seletiva da IOI desde o ano de 2014 até 2018. Além disso, o site possui competições, as "Ligas de Programação".
  • OJ.uz: Judge com muitos problemas de diversas olimpíadas internacionais, como a IOI e a BOI. Recomendamos para competidores de nível avançado.
  • URI: Judge brasileiro, com problemas separados por tópico. Possui problemas de várias fontes, como a maratona de programação e a OBI.
  • CP Algorithms: Site com uma vasta quantidade de conteúdos de programação. Recomendado especialmente para competidores de nível avançado. Infelizmente, o site se encontra apenas em inglês.
  • Algorithms Live!: Canal do Youtube com diversas aulas de conteúdos de nível avançado. O proprietário do canal é Matt Fontaine, um dos organizadores da USACO (olimpíada de computação dos EUA). Os vídeos são excelentes e abordam tópicos muito interessantes (porém, de nível avançado). Infelizmente, os vídeos são todos em inglês.
  • Brazil IOI Selection Contests: Grupo no site Codeforces com os problemas da Seletiva da IOI 2020. Os enuncidados se encontram tanto em português quanto inglês.

Livros recomendados

Recomendamos os seguintes livros, usados frequentemente por competidores de níveis variados:

Olimpíadas Internacionais

Olimpíadas Internacionais são uma ótima fonte de aprendizado, pois, em geral, possuem problemas difíceis e muito interessantes. Recomendamos fortemente que competidores avançados resolvam problemas destas competições. Os problemas das olimpíadas abaixo podem ser encontrados, em sua grande maioria, nos sites DMOJ e OJ.uz, citados acima.

Nota: Não recomendamos que procure soluções para problemas de olimpíadas internacionais sem antes pensar por muito tempo. Problemas desta categoria são, em sua grande maioria, difíceis, e portanto consideramos razoável dedicar o máximo de tempo possível neles.

  • IOI: Olimpíada Internacional de Informática.
  • OII: Olimpíada Ibero-Americana de Informática (antiga CIIC).
  • APIO: Olimpíada de Informática da Ásia-Pacífico.
  • BOI: Olimpíada Báltica de Informática.
  • BkOI: Olimpíada Balkan de Informática.
  • CEOI: Olimpíada Centro-Europeia de Informática.
  • JOI: Olimpíada Japonesa de Informática (recomendamos tanto as provas do Final Round como do Spring Camp).
  • RMI: Romanian Masters in Informatics.
  • USACO: Olimpíada de Informática dos Estados Unidos. Todos os problemas são encontrados no seu site.

Afinal - Por onde começar?

Começar a estudar para olimpíadas pode parecer, por vezes, amedrontador. Sabemos o quanto é difícil organizar os seus estudos e escolher os problemas e materiais certos. Entendemos também que recursos em português são, em geral, escassos.

Tendo isso em mente, para competidores que estão iniciando a sua jornada de olimpíadas, recomendamos as seguintes fontes:

  • Ementa da OBI: A ementa da OBI indica os tópicos cobrados em cada nível da competição. Recomendamos fortemente que aprenda todos os conteúdos necessários do seu nível.
  • Curso Noic de Informática: Curso de programação começando do zero, com aulas dos principais assuntos abordados em olimpíadas.
  • Neps Academy: Como já citado acima, é um judge brasileiro que possui problemas da OBI, Maratona de Programação, Seletivas da IOI e de competições próprias. Recomendamos, também, o seu curso.
  • URI: Outro judge brasileiro, com problemas de várias competições e separados por tópico. Recomendamos que se aprofunde em cada tópico estudado usando esse judge.
  • Codeforces: Apesar de ser um site em inglês, não podemos deixar de recomendar um dos mais famosos sites de programação competitiva. Para o competidor iniciante, recomendamos resolver problemas na faixa de dificuldade 1000 a 1600. Outra ferramenta muito útil do site é a possibilidade de escolher problemas por tópico.

Como organizar os estudos

Como uma dica final, sugerimos que, para organizar os seus estudos da melhor maneira possível, faça uma planilha contendo todos os problemas que você resolveu. Uma possível maneira de organizar esta planilha é incuir o nome e o link do problema, os assuntos utilizados e a data em que o problema foi resolvido. O serviço Google Sheets é uma ótima ferramenta para a criação de planilhas.

Esta planilha possui o objetivo de lhe ajudar a se manter motivado. Olhar problemas resolvidos anteriormente por você é uma ótima forma de acompanhar a sua evolução, e além disso, é possível decidir em que tópico focar baseando-se nos assuntos que você estudou com menor frequência.

A foto abaixo ilustra um possível modelo de planilha:

Esta sugestão não é universal e é, afinal, apenas uma sugestão. Caso sinta que esta dica não se aplica para você, sinta-se livre para estudar da maneira que preferir! Afinal, cada pessoa tem os seus próprios hábitos e preferências.

Por fim, esperamos que este guia tenho sido útil pra você. Desejamos bons estudos e lembre-se de aproveitar cada momento da sua jornada olímpica!