Uma estrutura de dados é um acordo entre as atualizações e as perguntas. Este artigo abre o capítulo das estruturas com as que guardam candidatos, ordem ou hash. No MSVC,...
Cada problema deste treino pergunta algo sobre um trecho de um vetor, e nenhum deles pode pagar o preço de ler o trecho inteiro. Às vezes a resposta é prometer...
Duas cadeias de 1024 letras, diferentes, têm o mesmo hash módulo 2^64 para qualquer base ímpar, e sortear a base não muda nada. Este artigo fecha o capítulo dos arrays...
Um inteiro de 64 bits é um conjunto de até 64 elementos, e uma instrução do processador faz a interseção de todos eles de uma vez. Este artigo usa bits...
Uma janela que anda uma posição perde um elemento e ganha outro, e quem recalcula a janela inteira paga k vezes mais do que precisa. Este artigo mantém o estado...
Somar um intervalo de cem mil posições custa cem mil somas, a menos que alguém tenha somado antes. Prefixos respondem a qualquer soma de intervalo com uma subtração, diferenças aplicam...
Cada problema deste treino pergunta, de um jeito ou de outro, onde fica uma fronteira. Às vezes é a primeira pedra depois de um peregrino, às vezes é o menor...
Quando as chaves são inteiros de um universo pequeno, ordenar não exige comparar. No MSVC, a contagem ordenou dez milhões de inteiros entre 0 e 255 em 11 ms, contra...
Nenhum algoritmo que só compara elementos ordena um milhão de números com menos de 18,5 milhões de comparações. O std::sort do MSVC fez 31 milhões e levou 61 ms. Uma...
Cada comparação de uma busca binária compra um bit de informação e descarta metade da incerteza. Vinte comparações bastam para um milhão de elementos. No MSVC, porém, a mesma busca...
Vários problemas deste treino são aritmeticamente triviais de propósito. Quando a conta é silenciosa, o custo de mover bytes, a semântica da conversão de texto e a posse dos caracteres...
Um algoritmo O(n log n) pode perder para a leitura da própria entrada. No MSVC, ler um milhão de inteiros com std::cin custou 360 ms, e um leitor de vinte...
Pagar um pré-processamento uma vez para responder muitas perguntas depressa é a primeira grande troca da série. Este treino cobra essa troca em sete problemas e, depois deles, aplica a...
Um vetor que cresce sozinho move cada elemento, em média, duas vezes no MSVC. Uma vista que filtra dez valores pode ler só sete. Uma tabela de contagem vence a...
Toda solução tem duas vidas. Na primeira, escolhemos a ideia e provamos que ela funciona. Na segunda, digitamos a ideia em C++23 depressa e limpo o bastante para que o...
Saber um algoritmo e entregar um programa correto com o relógio correndo são habilidades diferentes. O primeiro treino da série cobra a segunda, com sete problemas cujos enunciados não dizem...
A notação Big O conta operações e trata todas como iguais. O processador discorda. Vamos abrir a máquina e medir o preço de escolher o tipo errado, de percorrer a...
Um programa correto que estoura o limite de tempo recebe o mesmo veredito de um programa errado. A série começa aprendendo a contar o trabalho antes de escrever a primeira...
Um catálogo de regras de Cpp23 para código rápido, organizado por tema e temperado com a lição mais antiga da otimização, que é medir antes de acreditar.
Antes da main(), muita coisa já aconteceu: o sistema operacional carregou o processo, o loader resolveu bibliotecas e a runtime inicializou o ambiente.