XOR para aislar el valor que aparece una sola vez, la clase BitOperations que casi ningún código C# usa, y el desplazamiento que en silencio no hace nada porque el contador dio la vuelta.
Una plantilla, cinco problemas. Elegir, explorar, deshacer la elección — y es el deshacer lo que la gente deja fuera, porque el código parece terminado sin eso.
Toda la familia depende de una sola decisión: ordenar por el inicio, u ordenar por el final. La fusión quiere una, el voraz de planificación quiere la otra, y el código se ve casi igual en los dos casos.
Casi todo problema de árboles es una sola pregunta: ¿esta cantidad viaja hacia abajo por el árbol o de vuelta hacia arriba? Sumas de caminos, el diámetro que nunca toca la raíz, ancestros, y la verificación de BST que todos escriben mal la primera vez.
Tres órdenes recursivos que se diferencian por una sola línea, la versión iterativa que nadie logra reconstruir bajo presión, y por qué el recorrido por niveles necesita una variable local en vez de ingenio.
C# no trae el tipo de nodo que estos problemas dan por hecho, y LinkedList
La parte que solo te importa cuando una solución correcta ya excedió el límite de tiempo. Leer la entrada sin asignar memoria, el desbordamiento del que C# no te avisa, y por qué Console.WriteLine dentro de un bucle cuesta 400,000 escrituras.
No la teoría, sino las cinco formas que se repiten una y otra vez, y la única dirección de bucle que convierte una de ellas, en silencio, en un problema completamente distinto.
Los pesos rompen el BFS. Dijkstra lo arregla, el PriorityQueue de C# no tiene DecreaseKey así que insertas duplicados en su lugar, y cuando cada arista es 0 o 1 el heap resulta ser puro trabajo de más.
La representación que usan casi todas las soluciones en C# es también la razón por la que exceden el límite de tiempo. Después, búsqueda en anchura, búsqueda en profundidad sin la pila de llamadas, y el orden que detecta un ciclo sin costo extra.