Treino Seleção 2019
O treino do estágio de seleção 2019 será organizado por semanas. Cada
semana terá um tópico a estudar e terá 3 componentes obrigatórias:
leituras recomendadas, resolução de dois a três problemas e uma aula
por vídeo. Para mais informações consultem o regulamento da
seleção, que inclui um
sumário de cada semana.
Requisitos
Muitos dos problemas que vos serão propostos são provenientes de
vários online judges disponíveis (repositórios de problemas e
concursos). Como tal é aconselhado que criem uma conta e explorem as
seguintes plataformas: CodeForces;
Kattis.
Além de problemas originais, o CodeForces
incorpora um mini fórum de discussão que contém exposições sobre
vários temas técnicos e não técnicos. É principalmente uma plataforma
de concursos, por isso podem ainda participar nos vários concursos
disponibilizados, quer em tempo real quer virtualmente.
Muitas das leituras que recomendamos são de dois livros:
- Competitive Programmer's Handbook, por Antti Laaksonen, disponível aqui, abreviado como CPH
- Principles of Algorithmic Problem Solving, por Johan Sannemo, disponível aqui, abreviado como PAPS
Devem fazer download de ambos os livros e seguir os capítulos
recomendados em cada tópico.
Listagem de semanas
1. Semana 15/04 a 21/04: Programação dinâmica
Básicos de Programação dinâmica
Leituras recomendadas:
Programação dinâmica em DAG
Leituras recomendadas:
- Livro CPH, Capítulo 16.2 (até 'Extending Dijkstra’s algorithm')
Programação dinâmica em dígitos
Leituras recomendadas:
Aula por vídeo da semana
Data: Dia 20 de Abril às 20:30 (duração de 1 hora)
Tópicos a abordar:
- Programação dinâmica em árvores
- Programação dinâmica com intervalos
Perguntas de consolidação do tema
Depois de ler as leituras obrigatórias desta semana e resolver os problemas devo saber:
- Como identificar subproblemas de um problema e saber discretizá-los de forma a aplicar programação dinâmica.
- Como reconstruir a solução de um problema que calculámos usando programação dinâmica.
- Identificar diferentes tipos de estruturas onde podemos aplicar programação dinâmica (sequências, DAGs, dígitos de um número, árvores, ...)
Programação dinâmica bitmask (EXTRA)
Leituras recomendadas:
Programação dinâmica e combinatória (EXTRA)
Leituras recomendadas:
Problemas do CodeForces (EXTRA)
- Journey, Ronda #374 (Div. 2), Problema C: Resolver aqui
- Vasya and Array, Ronda Educational 56, Problema F: Resolver aqui
- Vladik and Memorable Trip, Ronda #416 (Div. 2), Problema C: Resolver aqui
- Helga Hufflepuff's Cup, Manthan Codefest 17, Problema C: Resolver aqui
- Linear Kingdom Races, Ronda #87, Problema E (Difícil): Resolver aqui
- Kalila and Dimna in the Logging Industry, Ronda #189, Problema C (Muito difícil): Resolver aqui
2. Semana 22/04 a 28/04: Estruturas de dados
Árvores binárias de pesquisa
Leituras recomendadas:
Implementações da STL: priority_queue, set, map, queue/stack, deque
Leituras recomendadas:
Segment trees
Leituras recomendadas:
- Livro PAPS, Capítulo 11.2
Problemas do CodeForces
- Remove Extra One, Ronda #450 (Div. 2), Problema C: Resolver aqui
- Pashmak and Parmida's problem, Ronda #261 (Div. 2), Problema D: Resolver aqui
Aula por vídeo da semana
Data: Dia 05 de Maio às 20:30 (duração de 1 hora)
Tópicos a abordar:
- Consolidar segtrees: generalizar funções e queries
- Aplicações em diferentes problemas fundamentais
Perguntas de consolidação do tema
Depois de ler as leituras obrigatórias desta semana e resolver os problemas devo saber:
- Identificar subproblemas comuns em vários problemas que podemos resolver aplicando a estrutura de dados certa: manter uma lista dinâmica e aplicar algumas operações como mínimo ou máximo (BST/set/map); manter uma lista dinâmica de números e saber quantos números há num certo intervalo (set/segment tree); manter uma sequência de números que atualizamos pontualmente e saber informações sobre subintervalos (segment tree).
Outras versões de Segment trees: lazy, 2d (EXTRA)
Leituras recomendadas:
Fenwick trees/BIT (EXTRA)
Leituras recomendadas:
Disjoint Set Union (EXTRA)
Leituras recomendadas:
Problemas do CodeForces (EXTRA)
- Segments Removal, Ronda #452 (Div. 2), Problema E: Resolver aqui
- The Bakery, Ronda #426 (Div. 2), Problema D: Resolver aqui
- Lucky Queries, Ronda #104 (Div. 1), Problema E (Difícil): Resolver aqui
- MEX Queries, Ronda Educational 23, Problema F (Difícil): Resolver aqui
3. Semana 29/04 a 05/05: Prova de Treino I
O concurso terá 5 problemas e a duração de 2 horas e meia. Link para o concurso (Prova de Treino I - 2019).
4. Semana 06/05 a 12/05: Grafos
Pesquisas DFS e BFS
Leituras recomendadas:
- Livro CPH, Capítulo 11 (opcional para introdução ao conceito de grafos)
- Livro CPH, Capítulo 12
Algoritmo de Bellman-Ford
Leituras recomendadas:
- Livro PAPS, Capítulo 12.3.2
Algoritmo de Dijkstra
Leituras recomendadas:
- Livro CPH, Capítulo 13, Secção 'Dijkstra's algorithm'
Aula por vídeo da semana
Data: Dia 19 de Maio às 20:30 (duração de 1 hora)
Tópicos a abordar:
- Grafos direcionados e TopoSort
- Componentes fortemente conexos e Pontes
Minimum spanning trees (EXTRA)
Leituras recomendadas:
- Livro CPH, Capítulo 15 (podem saltar a Secção de DSU se já tiverem visto)
Árvore de caminhos mais curtos (EXTRA)
Leituras recomendadas:
Ciclos de Euler (EXTRA)
Leituras recomendadas:
- Livro CPH, Capítulo 19 até 'Hamiltonian path'
Árvore de pontes (EXTRA)
Leituras recomendadas:
Problemas do CodeForces (EXTRA)
- Edges in MST, Ronda #111 (Div. 2), Problema D: Resolver aqui
- Paths and Trees, Ronda #303 (Div. 2), Problema E: Resolver aqui
- Tanya and Password, Ronda #288 (Div. 2), Problema D: Resolver aqui
- Wizard's Tour, Ronda #434 (Div. 2), Problema F (Difícil): Resolver aqui
- Dirty Arkady's Kitchen, Ronda #423 (Div. 1), Problema F (Difícil): Resolver aqui
5. Semana 13/05 a 19/05: Problemas dinâmicos
Técnicas fundamentais
Leituras recomendadas:
- Livro CPH, Capítulo 9.1 (Introdução a problema dinâmicos)
- Livro CPH, Capítulo 9.4
Decomposição SQRT
Leituras recomendadas:
- Livro CPH, Capítulo 27.1 e 27.2 (tudo até Mo's algorithm)
Estrutura de dados Buckets
Leituras recomendadas:
Aula por vídeo da semana
Data: Dia 27 de Maio às 20:30 (duração de 1 hora)
Tópicos a abordar:
- Truque de reconstrução de estruturas de dados em O(sqrt(q))
- Exemplos de problemas dinâmicos
Sparse tables e árvores/Lowest common ancestor (EXTRA)
Leituras recomendadas:
Truque para Segtrees em árvores (EXTRA)
Leituras recomendadas:
Algoritmo de Mo (EXTRA)
Leituras recomendadas:
Mais exemplos (EXTRA)
Leituras recomendadas:
Problemas do CodeForces (EXTRA)
- Till I Collapse, Ronda #406 (Div. 1), Problema C: Resolver aqui
- Powerful array, Ronda 2 Yandex 2011, Problema D: Resolver aqui
- Misha, Grisha and Underground, Ronda #425 (Div. 2), Problema D: Resolver aqui
- Letters Removing, Ronda #452 (Div. 1), Problema F: Resolver aqui
6. Semana 20/05 a 26/05: Prova de Treino II
O concurso terá 5 problemas e a duração de 3 horas. Link para o concurso (Prova de Treino II - 2019).
7. Semana 27/05 a 03/06: Output-only (otimização)
Introdução a problemas de otimização
Leituras recomendadas:
Algoritmos greedy
Leituras recomendadas:
Hill climbing
Leituras recomendadas:
Aula por vídeo da semana
Data: Dia 2 de Junho às 20:30 (duração de 1 hora)
Tópicos a abordar:
- Estudo de um exemplo: passos para abordar um problema de output-only
Otimização convexa (EXTRA)
Leituras recomendadas:
Pesquisa local (EXTRA)
Leituras recomendadas:
Problemas do CodeForces (EXTRA)
- Safe cracking, Ronda Beta #41, Problema C: Resolver aqui
- Online Exam, Ronda de Maratona 1 (Difícil/Problema de Maratona): Resolver aqui