XOR para isolar o valor que aparece uma vez, a classe BitOperations que quase nenhum código C# usa, e o deslocamento que silenciosamente não faz nada porque a contagem deu a volta.
Um template, cinco problemas. Escolher, explorar, desfazer — e é o passo de desfazer que as pessoas esquecem, porque o código parece pronto sem ele.
A família inteira gira em torno de uma escolha — ordenar pelo início, ou ordenar pelo fim. Mesclar quer uma, o guloso de agendamento quer a outra, e o código fica quase igual nos dois casos.
Quase todo problema de árvore é uma pergunta só — essa quantidade desce a árvore ou volta por ela? Somas de caminhos, o diâmetro que nunca toca a raiz, ancestrais, e a verificação de BST que todo mundo escreve errado na primeira vez.
Três ordens recursivas que diferem por uma linha, a versão iterativa que ninguém reconstrói sob pressão, e por que o percurso por níveis precisa de uma variável local em vez de esperteza.
O C# não traz o tipo de nó que esses problemas assumem, e LinkedList
A parte com que você só se importa depois que uma solução correta já estourou o limite de tempo. Ler a entrada sem alocar, o overflow sobre o qual C# não avisa, e por que Console.WriteLine dentro de um laço custa 400,000 escritas.
Não a teoria — as cinco formas que sempre voltam, e a única direção de laço que transforma, em silêncio, uma delas em um problema completamente diferente.
Pesos quebram o BFS. Dijkstra resolve, o PriorityQueue do C# não tem DecreaseKey então você insere duplicatas no lugar, e quando toda aresta é 0 ou 1 o heap acaba sendo puro trabalho a mais.
A representação que a maioria das soluções em C# usa é também o motivo de elas estourarem o limite de tempo. Depois, busca em largura, busca em profundidade sem a pilha de chamadas, e a ordenação que detecta um ciclo de graça.