Skip to Content

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:

  1. USACO Guide (General a Advanced): Estructura pedagógica por niveles, explicaciones intuitivas y selección de problemas graduados.
  2. 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-).
  3. 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”.
  4. 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.
  5. 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áginaOrigen / EnfoqueCómo abordarlo
Módulos USACOUSACO GuideExplicación conceptual paso a paso, ejemplos de código y lista de problemas ordenados por dificultad.
Artículos Teóricos (cpa-*)CP-AlgorithmsDemostraciones formales, análisis matemático y variantes teóricas avanzadas.
Para Entender de VerdadAlgorithmicaLectura complementaria al final del módulo sobre impacto en caché, arquitecturas modernas y trucos de CPU.
Soluciones IntegradasArchivo de solucionesExplicaciones 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)
  1. 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.
  2. 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.
  3. Implementación limpia: Escribí el algoritmo desde cero en tu editor, sin copiar y pegar del módulo.
  4. 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.
  5. 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::cout con 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 (N105N \ge 10^5), evitá java.util.Scanner y utilizá lectores rápidos basados en BufferedReader y StringTokenizer (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.readline y tené en cuenta que para algoritmos de grafos recursivos profundos puede ser necesario ajustar el límite de recursión con sys.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!