Cómo usar esta guía
¿Qué es este sitio?
Este sitio es una plataforma integral de aprendizaje de algoritmos y programación competitiva en español, diseñada para acompañarte desde los conceptos más básicos de programación hasta técnicas algorítmicas de nivel olímpico e internacional.
A diferencia de guías monolíticas tradicionales, este proyecto es un compendio unificado y curado que reúne lo mejor de las fuentes más prestigiosas del mundo del software competitivo:
- USACO Guide (General a Advanced): Estructura pedagógica por niveles, explicaciones intuitivas y selección de problemas graduados.
- CP-Algorithms (e-maxx): Artículos teóricos en profundidad, demostraciones matemáticas rigurosas, algoritmos de teoría de números, combinatoria y estructuras de datos avanzadas (identificados con el prefijo
cpa-). - Algorithms for Modern Hardware (Algorithmica): Análisis de rendimiento a nivel de hardware, jerarquía de memoria caché, vectorización SIMD e instrucciones de bajo nivel, accesibles en los bloques “Para entender de verdad”.
- Visualizadores Interactivos Propios: Módulos interactivos en Rive y React (Dos Punteros, Búsqueda Binaria, Sumas de Prefijos, Pintado de Cercas, División de Manzanas) para desarrollar intuición visual antes de escribir una sola línea de código.
- Base de Problemas Multijuez: Problemas seleccionados y clasificados de USACO, Codeforces, CSES Problem Set, AtCoder, LeetCode y Kattis.
Las 6 Etapas del Currículum
El camino de estudio está dividido en seis secciones progresivas:
[ Fundamentos ] ──> [ Bronce ] ──> [ Plata ] ──> [ Oro ] ──> [ Platino ] ──> [ Avanzado ]1. Fundamentos (/fundamentos)
- Objetivo: Dominar el entorno, la entrada/salida eficiente, tipos de datos, complejidad temporal/espacial, lectura de fórmulas matemáticas y calentamiento.
- Dirigido a: Quienes dominan la sintaxis básica de un lenguaje y quieren dar el salto a la resolución algorítmica de problemas y entrevistas técnicas.
2. Bronce (/bronce)
- Objetivo: Pensamiento algorítmico básico, simulación directa, búsqueda exhaustiva (fuerza bruta / recursión), ordenamiento básico, conjuntos y mapas elementales.
- Habilidades clave: Traducir enunciados complejos a lógica limpia sin cometer errores de implementación.
3. Plata (/plata)
- Objetivo: Técnicas clásicas de optimización polinomial: sumas de prefijos 1D/2D, dos punteros (two pointers), ventana deslizante (sliding window), búsqueda binaria sobre la respuesta, ordenamientos personalizados y primeros pasos en teoría de grafos (árboles, BFS y DFS).
- Equivalencia: Cubre la gran mayoría de los patrones requeridos para entrevistas técnicas de nivel Mid/Senior en empresas internacionales (LeetCode Mediums).
4. Oro (/oro)
- Objetivo: Algoritmos de grafos más complejos (Dijkstra, Bellman-Ford, Componentes Fuertemente Conexas, Árbol Generador Mínimo), Programación Dinámica (1D, 2D, mochila, sobre árboles, bitmasks), estructuras de datos avanzadas (DSU, Fenwick / Binary Indexed Trees, Segment Trees básicos) y combinatoria modular.
5. Platino (/platino)
- Objetivo: Consultas por rangos avanzadas (Lazy Propagation, Segment Trees persistentes, Treaps, Algoritmo de Mo), flujos en redes (Max Flow / Min Cut), geometría computacional y teoría de juegos.
6. Avanzado (/avanzado)
- Objetivo: Temas de frontera en olimpiadas (IOI/ICPC World Finals): Descomposición en Centroides, Transformada Rápida de Fourier (FFT / NTT), Estructuras de Sufijos (Suffix Automaton / Suffix Tree), optimizaciones de DP (Convex Hull Trick, Divide and Conquer Optimization) y optimizaciones para hardware moderno.
Tipos de Contenido y Cómo Navegarlos
Dentro de cada sección encontrarás distintos formatos de páginas según el objetivo pedagógico:
| Tipo de Página | Origen / Enfoque | Cómo abordarlo |
|---|---|---|
| Módulos USACO | USACO Guide | Explicación conceptual paso a paso, ejemplos de código y lista de problemas ordenados por dificultad. |
Artículos Teóricos (cpa-*) | CP-Algorithms | Demostraciones formales, análisis matemático y variantes teóricas avanzadas. |
| Para Entender de Verdad | Algorithmica | Lectura complementaria al final del módulo sobre impacto en caché, arquitecturas modernas y trucos de CPU. |
| Soluciones Integradas | Archivo de soluciones | Explicaciones detalladas de problemas clave con código comentado. |
Metodología de Estudio Recomendada
Aprender algoritmos no consiste en memorizar código, sino en reconocer patrones abstractos e invariantes. Te sugerimos este ciclo de 5 pasos para cada módulo:
1. Lectura Activa ──> 2. Experimentación ──> 3. Implementación ──> 4. Práctica (25 min) ──> 5. Análisis Post-Solución
(Concepto + Math) (Visualizadores) (Plantilla propia) (Lucha activa) (Comparar código)- Lectura activa y comprensión matemática: Leé la teoría prestando atención a los invariantes. Si encontrás fórmulas que no comprendés de inmediato, consultá la guía de Cómo leer fórmulas matemáticas.
- Experimentación visual: Si el módulo cuenta con visualizador interactivo (o ejemplos paso a paso), probá casos límite antes de escribir código.
- Implementación limpia: Escribí el algoritmo desde cero en tu editor, sin copiar y pegar del módulo.
- La regla de los 25–30 minutos: Al resolver un problema propuesto:
- Intentá resolverlo por tu cuenta durante al menos 25 a 30 minutos.
- Diseñá la solución en papel antes de codear.
- Si tras 30 minutos estás totalmente bloqueado, leé únicamente la primera pista o el enfoque general de la solución.
- Análisis post-solución: Aún si tu solución fue aceptada (AC), leé la solución oficial y las de otros competidores. Suele haber formas más concisas o elegantes de escribir el mismo algoritmo.
Lenguajes Soportados
El sitio incluye snippets de código y explicaciones adaptadas a los lenguajes principales de la disciplina:
C++ (Recomendado para Competitivo)
C++ es el estándar de oro en programación competitiva internacional por su velocidad de ejecución y la riqueza de la biblioteca estándar (STL: std::vector, std::set, std::map, std::priority_queue, algoritmos de <algorithm>).
- Versión estándar: C++17 o C++20.
- Recomendación: Usá
std::cin/std::coutcon optimización de I/O rápida (cin.tie(NULL)).
Java
Java ofrece un tipado estricto y una biblioteca de colecciones muy completa (ArrayList, TreeSet, HashMap, PriorityQueue).
- Recomendación: Para problemas con entrada masiva (), evitá
java.util.Scannery utilizá lectores rápidos basados enBufferedReaderyStringTokenizer(ver módulo de Entrada y Salida).
Python
Python destaca por su sintaxis concisa y velocidad de prototipado, ideal para etapas iniciales y entrevistas de código.
- Recomendación: Para competencias donde el tiempo límite es estricto (1 a 2 segundos), usá
sys.stdin.readliney tené en cuenta que para algoritmos de grafos recursivos profundos puede ser necesario ajustar el límite de recursión consys.setrecursionlimit(), o utilizar PyPy cuando esté disponible en el juez.
¿Competitivo o Entrevistas Técnicas?
- Si tu objetivo es la Programación Competitiva (ICPC, Iberoamericana, OIA, Codeforces, AtCoder): Seguí el orden secuencial completo hasta Platino/Avanzado. Practicá la velocidad con la Zona de Calentamiento y participá en rondas virtuales periódicas.
- Si tu objetivo son Entrevistas Técnicas (LeetCode, FAANG / Big Tech): Concentrate especialmente en Fundamentos, Bronce y Plata, complementando con temas seleccionados de Oro (Programación Dinámica básica, Grafos y DSU). Leé la guía especializada de De Programación Competitiva a LeetCode.
¡Éxitos en tu camino de aprendizaje!