Bienvenidos a la página de apoyo del curso Taller de Programacion II.
Este es un curso 100% práctico, orientado a entrenar a alumnos en programación competitiva y preparar equipos que participen en la ACM ICPC (celebrada anualmente) representando a la universidad. Por lo tanto, la nota final dependerá de la resolución por parte del alumno de problemas de programación competitiva. Cada cierto tiempo (una vez cada 1 o 2 semanas) se publicará un contest (o competencia, en español). Los contests se caracterizan por lo siguiente:
- Se publicarán en codepit.io, un sitio web brasileño (sí, casi todo está en portugués) que permite crear competencias utilizando problemas obtenidos de diferentes jueces online (los enunciados de estos problemas están casi siempre en inglés eso sí), con un scoreboard que se actualiza en tiempo real a medida que los participantes resuelven problemas. Para competir sólo basta con crearse una cuenta en codepet.io y posteriormente unirse a los contests a medida que estos vayan siendo publicados.
- Las competencias pueden ser ya sea individuales o grupales.
- En el caso de competencias grupales, les está permitido armar grupos de un máximo de 3 alumn@s (codepit.io permite hacer esto fácilmente).
- Cada contest tiene su propia exigencia default, es decir, un número mínimo de problemas a resolver (el cual puede ser diferente para cada contest). Sin embargo, si el alumno asiste a clases, se le restará 1 problema a su exigencia en el contest correspondiente, obteniéndose así una exigencia personalizada. Por ejemplo, si un contest tiene una duración de 3 semanas con una exigencia default de X problemas, y supongamos que 2 clases están asociadas a dicho contest, si un alumno asiste a ambas clases entonces obtendrá una exigencia personalizada de (X-2), mientra que si sólo asiste a una clase será de (X-1), y si no asiste a ninguna tendrá una exigencia de X.
- Cada contest tendrá una duración oficial máxima (generalmente 2 o 3 semanas). El alumno (o grupo de alumnos) tendrá dicho plazo para resolver los problemas del contest. Sean N los problemas resueltos por el alumno (o grupo de alumnos) y Xp la exigencia personalizada de un alumno "p". Según la cantidad de problemas resueltos, se generan dos posibles sub-casos:
- Si N >= Xp, dicho alumno obtiene una asistencia de 100% en dicho contest. Además, todos los problemas adicionales resueltos (N - Xp) se sumarán a un contador llamado excedente total.
- Si N < Xp, dicho alumno obtiene una asistencia de 100 * (Xp / N) % en dicho contest. Además, todos los problemas que le faltaron (Xp - N) se sumarán a un contador llamado deuda total.
- En codepit.io, cuando el plazo de un contest se acaba, los participantes pueden seguir enviando soluciones en un modo post-competencia conocido como upsolving. Todos los problemas resueltos en modo upsolving se agregarán a un contador llamado total upsolving Codepit.
Además de estos contests, existen otras 4 formas adicionales de obtener bonus para mejorar su nota final:
-
BONUS EXPLICACIÓN PROBLEMA DIFÍCIL (individual): Este bonus permite obtener hasta un máximo de 3 décimas cada vez, las que se sumarán directamente a su nota final. ¿Cómo obtener este bonus?:
- El alumno debe sacar accepted en un problema difícil que casi nadie más haya podido resolver. El problema debe pertenecer a alguno de los contests del semestre y puede ser resuelto en modo upsolving también (no es obligatorio alcanzar a resolverlo dentro de plazo).
- El alumno debe publicar su solución para que todos los demás la puedan ver (por ej. pueden subirla a un repositorio público en github).
- El alumno debe preparar y dar una explicación de la solución adelante durante la clase y debe asegurarse de que los demás compañeros le entiendan.
- **EXTRA: si están motivados con un problema difícil pero no saben por dónde empezar, pueden consultar con el staff del curso y nosotros trataremos de ayudarles/orientarles con material de estudio y consejos para resolver el problema.
-
BONUS RPC (grupal): Cada cierto tiempo la Red de Programación Competitiva (RPC) organiza competencias de entrenamiento. El calendario y registro para estas competencias se encuentran acá: http://registro.redprogramacioncompetitiva.com/contests, y los scoreboards de las competencias pasadas se pueden encontrar acá: http://redprogramacioncompetitiva.com/Contest. Nótese que se trata de un bonus grupal, por ende para obtener este bonus deben:
- Registrarse en grupos de 2 o 3 alumnos.
- Mandar una foto del grupo con todos sus integrantes juntos frente a un mismo computador (sí, la idea es que se junten físicamente usando un solo computador, como en la competencia real).
- Mandar el link al scoreboard final de la competencia RPC en que participaron.
- El bonus se calculará como 6 * (X/N) décimas, donde X = problemas resueltos por el grupo, N = problemas resueltos por el equipo que quedó en primer lugar. Las 6 * (X/N) décimas obtenidas se sumarán directamente a su nota final.
- **EXTRA: las RPCs tienen un modo post-maratón (lo mismo que el upsolving de codepit.io), así que si los alumnos lo desean pueden seguir resolviendo problemas en este modo, avisarnos, y estos problemas se les sumarán a un contador llamado total upsolving RPC.
-
BONUS Codeforces (individual): Cada cierto tiempo Codeforces organiza competencias individuales, que generalmente duran alrededor de 2 horas, con problemas de diferentes niveles de dificultad. Si se registran en Codeforces, el sitio les debería ir avisando por email sobre las próximas competencias. Alternativamente, pueden revisar el siguiente calendario o bien utilizar esta página y en el search box tipear "codeforces". Para obtener este bonus deben:
- Registrarse en Codeforces.
- Participar en una competencia.
- Al final de la competencia avisarnos en qué competencia participaron (por ej. mandar el link a su perfil de Codeforces).
- El bonus se calculará como 3 * (X/N) décimas, donde X = problemas resueltos por el alumno, N = problemas resueltos por la persona que quedó en primer lugar. Las 3 * (X/N) décimas obtenidas se sumarán directamente a su nota final.
- **EXTRA: al finalizar la competencia, si quedaron con ganas de resolver problemas que no alcanzaron a resolver durante la competencia, pueden hacerlo, avisarnos, y estos problemas se les sumarán a un contador llamado total upsolving Codeforces.
-
BONUS Regional (grupal): Cada año las universidades mandan sus mejores equipos para participar en las competencias regionales de la ACM ICPC. Sólo los mejores equipos en cada región logran clasificar a las ACM ICPC World Finals. La PUC no es una excepción así que seleccionaremos los mejores 3 equipos (cada equipo con 3 alumnos) que nos representarán en la regional, la cual este año se llevará a cabo el 10 de Noviembre en la Universidad Austral de Chile, Valdivia. ¿Cómo obtener este bonus?
- Deben ser parte de alguno de los 3 mejores equipos seleccionados para representar a la PUC en la regional.
- El bonus se calculará como 10 * (X/N) décimas, donde X = problemas resueltos por el equipo, N = problemas resueltos por el equipo que quedó en primer lugar. Las 10 * (X/N) décimas obtenidas se sumarán directamente a su nota final.
La nota final se calcula calculando muchas cosas:
- El promedio de la asistencia de todos los contests (llamémoslo X).
- En caso de que X < 100%, el porcentaje que les falte (100% - X) lo pueden recuperar "reduciendo" su deuda total de problemas (llamémosla D). Para esto se hará el siguiente update:
- D := deuda total de problemas
- K := X * (excedente total + total upsolving Codepit + total upsolving RPC + total upsolving Codeforces)
- nótese que la sumatoria anterior es "penalizada" por la asistencia promedio (i.e. vale más resolver problemas dentro de plazo que fuera de plazo).
- D_reducido = max {D - K, 0}
- X_aumentado = X + (1 - X) * ((D - D_reducido) / D)
- Así se puede calcular su nota:
- Nota = 1 + 6 * X_aumentado
- Sin embargo, luego se bajará la escala del curso, donde el alumno con mayor asistencia quedará con nota 7 (siempre y cuando la escala baje "poco" - i.e. habrá un límite para bajar la escala).
- Nota_v2 = aplicar_escala_reducida(Nota)
- Finalmente, se aplicarán las décimas de bonus:
- Nota_v3 = Nota_v2 + BONUS EXPL. PROB. DIFÍCILES + BONUS RPC + BONUS Codeforces + BONUS Regional
Todo lo anterior se encuentra formalizado en el siguiente google spreadsheet: https://docs.google.com/spreadsheets/d/1wm2jleZBV_M8V6FbTBpKfcI4uzNTg9ReMvnjq21LBXY/edit?usp=sharing
El nivel de dificultad de los problemas en las regionales ICPC es bien alto, y por lo tanto un buen entrenamiento requiere que los alumnos sean expuestos a problemas de ese nivel. Sin embargo, entendemos que tirar a los alumnos nuevos "a los leones" de golpe puede ser un poco traumático. Por lo tanto, para los primeros 3 contests tendremos dos divisiones: división 1 (más difícil) y división 2 (más fácil). Los alumnos nuevos pueden optar por participar en la división 2 si así lo desean.
En programación competitiva el lenguaje más utilizado por lejos es C++ (y dentro de C++ generalmente se usa de C++11 para arriba). En segundo lugar se encuentra Java. Y hace muy poco se comenzó a utilizar también Python. Sin embargo, lamentablemente la mayoría de los jueces online (los servidores que tienen los enunciados de los problemas y ejecutan los códigos enviados por la gente) generalmente están calibrados para aceptar soluciones en C++ y a veces Java, y pasa mucho que las soluciones en Python fallan con el famoso Time Limit Exceeded (TLE), ya que Python de por sí es un lenguaje interpretado que se demora mucho más en ejecutar que lenguajes compilados a código de máquina como C++. Además, la mayoría de los códigos de ejemplo disponibles en internet para progcomp están en C++ o quizá Java. Dado lo anterior, el consejo típico es aprender C++. A los alumnos nuevos que quieran seguir este consejo, les recomendamos aprovechar los primeros 3 contests en división 2 para aprender a programar en C++. Más abajo pueden encontrar harto material de estudio al respecto.
- En C++, en general pueden hacer un poco más de 10^8 operaciones por segundo (una estimación bien al ojo por experiencia con diferentes jueces online).
- Siempre estimen la complejidad computacional de su algoritmo y evalúenla con el caso de prueba más grande (peor caso). Por ejemplo, si un problema depende de N donde 1 <= N <= 10^5 y mi algoritmo es cuadrático (complejidad = O(N^2)), entonces en el peor caso haré (10^5)^2 = 10^10 operaciones, y por ende según el punto anterior necesitaría 100 segundos para correrlo. En cambio, si mi algoritmo tiene complejidad O(N*log(N)) entonces en el peor caso sólo haré 10^5 * log(10^5) = 1.7 * 10^6 operaciones (aprox.), y por ende sólo necesitaría 0.017 segundos (la nada misma) para correrlo. Entonces, si mi problema tiene un tiempo máximo de ejecución de 2 segundos, ¿qué algoritmo va a funcionar? Claramente el segundo.
- Si van a usar mucha memoria, preocúpense de no pasarse del límite de memoria permitido. Por ejemplo si les dan 256MB de memoria, en bytes eso es 256 * 1024 * 1024 = 268435456 bytes, un int32 ocupa 4 bytes, así que como máximo podrían crear un arreglo de int32 de largo 67108864 = 6.7 * 10^7 aprox (o la mitad si usan un int64, un double, etc.). También podría acabárseles la memoria si hacen demasiadas llamadas recursivas [1, 2].
En este curso está totalmente permitido buscar en internet material, explicaciones e incluso ejemplos de soluciones de problemas. Tienen todo el internet a su disposición. Las únicas reglas que deben cumplir son:
- no buscar explicaciones / soluciones de problemas a menos que ya estén rendidos intelectualmente
- nunca hacer copy-paste de soluciones ajenas, sino que deben entender la solución (teoría + implementación) y ser capaces de programar dicha solución por ustedes mismos después (la idea es que aprendan, si hacen copy-paste no van a estar aprendiendo nada)
- Canales de Youtube con muchas explicaciones:
- Abdul Bari: https://www.youtube.com/channel/UCZCFT11CWBi3MHNlGf019nw
- Algorithms Live!: https://www.youtube.com/channel/UCBLr7ISa_YDy5qeATupf26w/
- Tushar Roy - Coding Made Simple: https://www.youtube.com/channel/UCZLJf_R2sWyUtXSKiKlyvAw
- Programación Competitiva CL: https://www.youtube.com/channel/UCmVg7YyMS8H-65WCmkVHB9g/feed
- Repositorios con muchos códigos de ejemplo (implementaciones de algoritmos y estructuras de datos típicos):
- C++ Cheat Sheet for ACM ICPC : https://github.com/ntuorangejuice/cheat-sheet
- Stanford University ICPC Team Notebook: https://cs.stanford.edu/group/acm/SLPC/notebook.pdf
- Google Doc con muchos códigos (C++): https://docs.google.com/document/d/1rcex_saP4tExbbU62qGUjR3eenxOh-50i9Y45WtHkc4/edit
- Google Doc con Apuntes de Robinson Castro et al (C++): https://docs.google.com/document/d/1pan53PU9_PIrPPVyNrbfXIAU-B6YnIaSBcB9lP9j0jE/edit
- Repo de Apuntes del team Caloventor en Dos (C++): https://github.com/mvpossum/eldiego
- Repo de Apuntes de Pablo Messina (C++): https://github.com/PabloMessina/Competitive-Programming-Material
- Otras páginas con links a muchos recursos y material de estudio:
- CP-ALGORITHMS: https://cp-algorithms.com/
- Codeforces: An awesome list for competitive programming!: https://codeforces.com/blog/entry/23054
- All of the good tutorials found on codeforces: https://codeforces.com/blog/entry/57282
- Standford CS 97SI: Introduction to Programming Contests: http://web.stanford.edu/class/cs97si/
- GeeksForGeeks: HOW TO PREPARE FOR ACM ICPC: https://www.geeksforgeeks.org/how-to-prepare-for-acm-icpc/
- GeeksForGeeks: Top 10 Algorithms and Data Structures for Competitive Programming: https://www.geeksforgeeks.org/top-algorithms-and-data-structures-for-competitive-programming/
- Sitio web del Taller de la U. de Chile: http://progcomp.cl/taller
- Techie Delight: Coding made easy: http://www.techiedelight.com/
- Material Campamento 2015 progcomp.cl: http://campamento2015.progcomp.cl/material
- Material Campamento 2016 progcomp.cl: http://campamento2016.progcomp.cl/material
- Material Campamento 2017 progcomp.cl: http://campamento2017.progcomp.cl/material
- Material Campamento 2018 progcomp.cl: http://campamento2018.progcomp.cl/material
- Libros con harto material de programación competitiva:
- Competitive Programmer's Handbook: https://www.cses.fi/book.pdf
- Competitive Programming 2: https://www.scribd.com/doc/155208844/Competitive-Programming-2
- Competitive Programming 3 (CP3): https://cpbook.net/
- Blogs con explicaciones:
- Blog CaloventorEnDos: http://caloventorendos.blogspot.cl
- Chocoblog: https://chococontest.wordpress.com/
- Codeforces - ACM ICPC 2011 Latin America Finals
- Codeforces - ACM ICPC 2012 Latin America Finals
- Codeforces - ACM ICPC 2014 Latin America Finals
- Codeforces - ACM ICPC 2015 Latin America Finals
- Codeforces - ACM ICPC 2016 Latin America Finals
- Codeforces - ACM ICPC 2017 Latin America Finals
- Codeforces - ACM ICPC 2018 Latin America Finals
- Google Sheet con soluciones de las últimas regionales (work in progress): https://docs.google.com/spreadsheets/d/1F8aBV83xKPVFfq_A0EKhCa8qbjf0gKKg8puQF-rbonQ/
- Inputs y outputs oficiales de regionales latam pasadas: http://maratona.ime.usp.br/antigas18.html
- INPUT / OUTPUT:
- Yet again on C++ input/output: http://codeforces.com/blog/entry/5217
- ¿Qué es mejor para leer input / imprimir output? cin/cout vs printf/scanf: http://www.cplusplus.com/forum/beginner/34165/
- Documentación Oficial de C++: http://www.cplusplus.com/reference/
- C++ Tutorial (SOLO LEARN: EVERYONE CAN CODE): https://www.sololearn.com/Course/CPlusPlus/
- LearnCpp: http://www.learncpp.com/
- Intro a C++: https://youtu.be/pqWsOsfGKA0
- Intro a la Programación Competitiva en C++: https://youtu.be/zTUJFG34Tyw
- Estructuras básicas en C++: https://youtu.be/OldL5e5eGmY
- C++ Programming Video Tutorials For Beginners [ Complete Series ]: https://www.youtube.com/playlist?list=PLfVsf4Bjg79Cu5MYkyJ-u4SyQmMhFeC1C
- C++ Cheat Sheets & Tricks:
- C++ Cheat Sheet for ACM ICPC : https://github.com/ntuorangejuice/cheat-sheet
- Aquí pueden encontrar un C++ Solution Template (código que uno siempre escribe al comenzar una solución) + MUCHO MUCHO más :)
- C++ STL cheatsheet for competitive programming: https://gist.github.com/satwikkansal/c959e89161cc60db16b412233177feab
- C++ Tricks: https://codeforces.com/blog/entry/15643
- C++ tricks for competitive programming (for C++ 11): https://www.geeksforgeeks.org/c-tricks-competitive-programming-c-11/
- C++ Cheat Sheet de Pablo Messina: https://github.com/PabloMessina/Competitive-Programming-Material/blob/master/c%2B%2B_cheat_sheet.cpp
- C++ Cheat Sheet for ACM ICPC : https://github.com/ntuorangejuice/cheat-sheet
- Conocimiento avanzado del lenguaje:
- Pointers vs References: http://www.ntu.edu.sg/home/ehchua/programming/cpp/cp4_pointerreference.html
- lvalues vs rvalues: https://eli.thegreenplace.net/2011/12/15/understanding-lvalues-and-rvalues-in-c-and-c
- Operator and Function Overloading: https://www.tutorialspoint.com/cplusplus/cpp_overloading.htm
- Functors: https://stackoverflow.com/questions/356950/what-are-c-functors-and-their-uses
- Lambda Functions: https://www.cprogramming.com/c++11/c++11-lambda-closures.html
- Instalando y corriendo C++:
- Windows:
- Ubuntu:
- Mac:
- Ejemplo de secuencia de pasos para resolver un problema en C++ en Windows usando la terminal (en Linux/Mac es bien parecido):
- Crear un archivo example.cpp
- Escribir un código de C++ válido y guardar.
- Abrir una terminal y navegar a la carpeta donde está el archivo.
- Opción 1:
- En la terminal, compilar y ejecutar con el comando:
g++ -std=c++11 example.cpp && a.exe
- Escribir el input directamente en la terminal
- El output irá apareciendo poco a poco en la terminal (intercalado con el input)
- En la terminal, compilar y ejecutar con el comando:
- Opción 2:
- Crear un archivo en la carpeta donde están parados llamado input.txt, copiar y pegar el input ahí y guardar.
- En la terminal, compilar y ejecutar con el comando:
g++ -std=c++11 example.cpp && a.exe < input.txt
- el output aparecerá en la misma terminal
- Opción 3:
- Crear un archivo en la carpeta donde están parados llamado input.txt, copiar y pegar el input ahí y guardar.
- En la terminal, compilar y ejecutar con el comando:
g++ -std=c++11 example.cpp && a.exe < input.txt > output.txt
- el output quedará guardado en el archivo output.txt
- General Ideas: https://codeforces.com/blog/entry/48417
- Binary Search:
- https://www.youtube.com/watch?v=jf1baieXkSQ
- https://www.tutorialspoint.com/data_structures_algorithms/binary_search_algorithm.htm
- https://github.com/PabloMessina/Competitive-Programming-Material/blob/master/Search/BinarySearch.cpp
- http://progcomp.cl/binarysearch
- caso especial: binary search on doubles - codeforces
- Ternary Search:
- https://www.hackerearth.com/practice/algorithms/searching/ternary-search/tutorial/
- https://en.wikipedia.org/wiki/Ternary_search
- https://github.com/PabloMessina/Competitive-Programming-Material/blob/master/Search/TernarySearch.cpp
- Reemplazando Ternary con Binary Search: Codeforces - The great ternary search hoax
-
Union Find (Disjoint Sets):
-
Segment Tree:
-
Segment Tree Lazy:
- Lazy Propagation Segment Tree: https://www.youtube.com/watch?v=xuoQdt5pHj0
- Segment Tree - Range Queries with Lazy Updates: https://www.youtube.com/watch?v=CN0N1ddJ9hA
- Implementaciones de Ejemplo:
-
Fenwick Tree (a.k.a. BIT o Binary Indexed Tree):
- HackerEarth - binary indexed tree made easy
- (recomendado) (explicación de Jorge Pérez) https://youtu.be/0PzR0IoqkkU?t=2160
- https://youtu.be/0PzR0IoqkkU?t=1453 (por si quieren ver la explicación de sweep line también que viene justo antes)
- (recomendado) https://www.youtube.com/watch?v=CWDQJGaN1gY
- http://progcomp.cl/fenwicktree
- https://cs.stackexchange.com/questions/10538/bit-what-is-the-intuition-behind-a-binary-indexed-tree-and-how-was-it-thought-a
- https://www.topcoder.com/community/data-science/data-science-tutorials/binary-indexed-trees/
-
Fenwick Tree 2D:
-
Wavelet Tree: https://www.dcc.uchile.cl/~jperez/papers/ioiconf16.pdf
- ¿Qué es DP?
- Bottom-Up vs Top-Down: http://stackoverflow.com/questions/6164629/dynamic-programming-and-memoization-bottom-up-vs-top-down-approaches
- Playlist con muchos ejemplos: https://www.youtube.com/watch?v=8LusJS5-AGo&list=PLrmLmBdmIlpsHaNTPP_jHHDx_os9ItYXr
- DPs típicos:
- Knapsack:
- TSP (travelling salesman problem / vendedor viajero):
- Optimizaciones para DP:
- Divide & Conquer Optimization:
- http://jeffrey-xiao.github.io/#!/blog/posts/2015-12-14-Divide-and-Conquer-Optimization
- https://www.hackerrank.com/contests/ioi-2014-practice-contest-2/challenges/guardians-lunatics-ioi14/editorial
- https://github.com/PabloMessina/Competitive-Programming-Material/blob/master/Dynamic_Programming/Divide%26ConquerOptimization.cpp
- https://www.youtube.com/watch?v=wLXEWuDWnzI
- Divide & Conquer Optimization:
- Slides de Nico Lehmann sobre Grafos:
- http://campamento2015.progcomp.cl/material (revisar la parte Grafos)
- http://campamento2016.progcomp.cl/material (revisar la parte Grafos)
- Trees (Árboles): https://en.wikipedia.org/wiki/Tree_(graph_theory)
- Play list sobre Grafos: https://www.youtube.com/playlist?list=PLrmLmBdmIlpu2f2g8ltqaaCZiq6GJvl1j
- Breadth First Search (BFS) & Depth First Search (DFS):
- Flood Fill: https://en.wikipedia.org/wiki/Flood_fill
- Articulation Points (aka Cut Vertices), Bridges (aka Cut Edges) and Biconnected Components (aka Blocks):
- Graph Theory: 53. Cut-Vertices: https://www.youtube.com/watch?v=BxAgmaLWaq4
- Graph Theory: 55. Bridges and Blocks: https://www.youtube.com/watch?v=iGsxKUzW3cs
- Menger's Theorem: https://www.youtube.com/watch?v=dUAeleBMRCQ
- Articulation Points Graph Algorithm: https://www.youtube.com/watch?v=2kREIkF9UAs
- http://web.iitd.ac.in/~bspanda/biconnectedMTL776.pdf
- https://www.hackerearth.com/practice/algorithms/graphs/articulation-points-and-bridges/tutorial/
- https://www.hackerearth.com/practice/algorithms/graphs/biconnected-components/tutorial/
- Código de ejemplo: https://github.com/PabloMessina/Competitive-Programming-Material/blob/master/Graphs/articulation-points%2Ccut-edges%2Cbiconnected-components.cpp
- Diameter of a Tree:
- Dijkstra:
- Minimum Spanning Tree:
- Kruskal's Algorithm:
- Prim's Algorithm:
- Correcteness Proofs:
- Proof of Cut Property: https://www.youtube.com/watch?v=P7K7mG8QDVM
- Proof of Prim's MST algorithm using cut property: https://www.youtube.com/watch?v=UfhUr5QzfiI
- Correctness of Kruskal's Algorithm: https://www.youtube.com/watch?v=S9PIItOUyzA
- Example Code: https://github.com/PabloMessina/Competitive-Programming-Material/blob/master/Graphs/MinimumSpanningTree.cpp
- Topological Sort:
- Lowest Common Ancestor (LCA):
- General Overview of Methods:
- http://codeforces.com/blog/entry/16221 (skip to the LCA part)
- Sparse Tables and LCA: https://www.youtube.com/watch?v=EKcQt-74bNw
- Method 1 (RECOMMENDED): Binary Lifting Method (aka jump pointers: https://en.wikipedia.org/wiki/Level_ancestor_problem#Jump_pointer_algorithm):
- http://codeforces.com/blog/entry/22325
- Note: as the post says, this method is very handy as it can be also used to compute querys over paths in Trees
- https://www.youtube.com/watch?v=kOfa6t8WnbI
- http://codeforces.com/blog/entry/22325
- Method 2: Euler Tour + Range Minimun Query:
- https://www.topcoder.com/community/data-science/data-science-tutorials/range-minimum-query-and-lowest-common-ancestor/
- Sparse Table Algorithm Range Minimum Query: https://www.youtube.com/watch?v=c5O7E_PDO4U
- Example Code of Both Methods:
- General Overview of Methods:
- Level Ancestor:
- Heavy-Light Decomposition:
- Max Flow:
- Ford-Fulkerson Algorithm:
- Dinic Algorithm (RECOMENDADO):
- Casos de uso:
- (MUY RECOMENDADO) Ejemplos de problemas usando flujo: https://www.youtube.com/watch?v=nKcVc8XkFSA
- Maximum Bipartite Matching: http://www.geeksforgeeks.org/maximum-bipartite-matching/
- Rolling Hashing:
- Suffix Array:
- ¿Qué es un suffix array?: Youtube - Suffix Array introduction
- HackerRank - Suffix Array: https://www.hackerrank.com/challenges/ashton-and-string/topics/suffix-array
- Suffix Array Construction: https://www.cs.helsinki.fi/u/tpkarkka/opetus/10s/spa/lecture11.pdf
- Códigos de Ejemplo:
- Trie:
- KMP (String Pattern Matching):
- Shortest Repeating Cycle:
- Números Primos:
- Tests de Primailidad:
- Fastest algorithm for primality test: https://stackoverflow.com/questions/2586596/fastest-algorithm-for-primality-test
- Miller Rabin:
- Criba de Eratóstenes (todos los primos hasta N):
- Criba de Eratóstenes [ICPCCL 2016]: https://www.youtube.com/watch?v=J4QCQ0dgeCI
- https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
- Prime Factorization of Factorials: http://mathforum.org/library/drmath/view/67291.html
- Tests de Primailidad:
- Aritmética Modular:
- ¿De qué se trata Aritmética Modular?
- Introduction to Modular arithmetic: https://www.youtube.com/watch?v=9lUSKOjV4d0
- High level introduction to modular arithmetic: https://www.youtube.com/watch?v=r0gYad8auYY
- Congruence (Modular Arithmetic) & 5 Properties Explained with 7 Problems: Ultimate Shortcuts: https://www.youtube.com/watch?v=B1gD6540uWA
- Modular Exponentiation By Squaring:
- Modular Fibonacci with Exponentiation by Squaring:
- Algoritmo de Euclides:
- Algoritmo de Euclides [ICPCCL 2016]: https://www.youtube.com/watch?v=k47fkSULGr0
- GCD (greatest common divisor): https://www.youtube.com/watch?v=5jLWXwSXJdg
- GCD extendido: https://www.youtube.com/watch?v=hB34-GSDT3k
- Multiplicative Inverse Mod N: https://www.youtube.com/watch?v=_bRVA5b4sb4
- https://github.com/PabloMessina/Competitive-Programming-Material/blob/master/Mathematics/euclidean_algorithm.cpp
- Modular Binomial Coefficient (Choose(n,k) mod X):
- Modular Multinomial Coefficient:
- ¿De qué se trata Aritmética Modular?
- Integración Numérica:
- Wikipedia: https://en.wikipedia.org/wiki/Numerical_integration
- Codeforces: Tasks involving numerical integration: https://codeforces.com/blog/entry/8242
- Explanation of Simpson's rule | MIT 18.01SC Single Variable Calculus, Fall 2010: https://www.youtube.com/watch?v=uc4xJsi99bk
- Simpson's Rule & Numerical Integration: https://www.youtube.com/watch?v=7EqRRuh-5Lk
- Numerical Integration With Trapezoidal and Simpson's Rule: https://www.youtube.com/watch?v=RTX-ik_8i-k
- Video Repaso de Geometría (SÚPER BUENO):
- Geometría Computacional [ICPCCL 2016]: https://youtu.be/nk5ejrBWORw?list=PL-c_98SOXhxaXMMfnemh2ihniZsj57L8-
- Geometry: 2D points and lines [Tutorial]: https://codeforces.com/blog/entry/48122
- Cross Product and Dot Product: Visual explanation: https://www.youtube.com/watch?v=h0NJK4mEIJU
- Producto Cruz:
- Cross Product - Math is fun: https://www.mathsisfun.com/algebra/vectors-cross-product.html
- Cross products | Essence of linear algebra, Chapter 10: https://www.youtube.com/watch?v=eu6i7WJeinw
- Calculating a 2D Vector's Cross Product: https://stackoverflow.com/questions/243945/calculating-a-2d-vectors-cross-product
- https://codeforces.com/blog/entry/48122 (saltarse a la parte cross product)
- Producto Punto:
- https://codeforces.com/blog/entry/48122 (saltarse a la parte dot product)
- Dot Product & Angle Between Vectors: https://www.youtube.com/watch?v=p8BZTFNSKIw
- Códigos varios de geometría 2D: https://github.com/PabloMessina/Competitive-Programming-Material/blob/master/Geometry/Geometry2DUtils.cpp. Incluye:
- Ejemplo de un struct Point
- Producto Cruz: Orientación de un punto respecto a un rayo (left, collinear o right)
- Ordenar segmentos disjuntos por orden de intersección respecto a un rayo usando producto cruz
- Detectar intersección de rectángulos
- Detectar intersección de segmentos
- Detectar intersección de círculos
- Distancia punto - segmento
- Distancia punto - recta
- Hashing de ecuación de recta a partir de 2 puntos
- Trigonometría: https://github.com/PabloMessina/Competitive-Programming-Material/blob/master/Geometry/Trigonometry.cpp. Incluye:
- Cálculo del ángulo de un vector 2D (medido ccw con respecto x+) usando atan2(y,x)
- Implementación del teorema del coseno para cálcular ángulos internos de triángulos
- Cálculo de Áreas:
- Teorema de Green (aplicado al caso particular de calcular áreas):
- lecturas:
- videos:
- Green's Theorem: https://www.youtube.com/watch?v=a_zdFvYXX_c
- 78 - Finding area with Green's theorem: https://www.youtube.com/watch?v=42vEvHpXYP8
- How to Use Green's Theorem to Find the Area of A Region: https://www.youtube.com/watch?v=w3ugdu0oFgE
- Green's Theorem: area under an arch | MIT 18.02SC Multivariable Calculus, Fall 2010: https://www.youtube.com/watch?v=KXof0q88xbg
- Código ejemplo: https://github.com/PabloMessina/Competitive-Programming-Material/blob/master/Geometry/GreensTheorem.cpp
- Área de un polígono simple:
- Teorema de Green (aplicado al caso particular de calcular áreas):
- Sweep Line y Radial Sweep Line:
- Detectar si un punto está dentro de un polígono:
- http://geomalgorithms.com/a03-_inclusion.html
- https://en.wikipedia.org/wiki/Point_in_polygon
- Código ejemplo: https://github.com/PabloMessina/Competitive-Programming-Material/blob/master/Geometry/PointInPolygon.cpp
- Point in Convex Polygon: http://stackoverflow.com/questions/1119627/how-to-test-if-a-point-is-inside-of-a-convex-polygon-in-2d-integer-coordinates
- Dualidad Línea Punto:
- Buenas slides explicando dualidad: https://algo.kaust.edu.sa/Documents/cs372l13.pdf
- Excelente pdf con demostraciones: https://pdfs.semanticscholar.org/810c/e0c19283481567c6545bf8c0cc8a4dcb8a1f.pdf
- Aplicación interactiva: http://students.cec.wustl.edu/~tdeck/duality/
- Convex Hull:
- Buen video explicando Convex Hull: https://www.youtube.com/watch?v=wRTGDig3jx8
- Monotone Chain Algorithm (algoritmo recomendado):
- Convex Hull Trick:
-
Contest 1 [INDIVIDUAL]:
- División 1: https://www.codepit.io/#/contest/5b68c884766004001f49fb52/view
- hints: geometría 2D
- División 2: https://www.codepit.io/#/contest/5b68d13b766004001f49fb56/view
- hints: problemas de implementación, un poco de geometría 2D
- Fecha Inicio: 06 de Agosto
- Duración: 20 días
- Soluciones de Ejemplo:
- Div1: Left, Right or Center?, Inside or Outside?, Counting Triangles, ACIS, A Contagious vIruS, Dating On-Line, Cake Cut [v1,v2], Keeping the Dogs Apart, Fence the Vegetables Fail, Arranging Tiles, High Mountains
- Div2: Sum of the Others, Touchscreen Keyboard, Polynomial Multiplication 1, Planting Trees, Chewbacca and Number, Left, Right or Center?, Inside or Outside?, Counting Triangles
- División 1: https://www.codepit.io/#/contest/5b68c884766004001f49fb52/view
-
Contest 2 [GRUPAL]:
- División 1: https://www.codepit.io/#/contest/5b75d4f5766004001f49ffda/view
- División 2: https://www.codepit.io/#/contest/5b75e7976ea097002368b564/view
- Fecha Inicio: 17 de Agosto
- Duración: 23 días
- Soluciones de ejemplo:
- Div 1: Stacking Cylinders, Little Mammoth, Environment Protection, Dinosaur Menace, Arranging Tiles, Fence the Vegetables Fail, High Mountains, Balloon, Hide and Seek, Olympic Games, Long Night of Museums
- Div 2: Buggy ICPC, Model Rocket Height, Card Trick, Stacking Cylinders, Little Mammoth, Environment Protection, Dinosaur Menace
-
Contest 3 [INDIVIDUAL]:
- División 1: https://www.codepit.io/#/contest/5b873d316ea097002368bfc5/view
- División 2: https://www.codepit.io/#/contest/5b873b03766004001f4a0a2b/view
- Fecha Inicio: 31 de Agosto
- Duración: 38 días
- Soluciones de ejemplo:
- Div 1: Exposing Corruption, Olympic Games, Little Mammoth, Cleaning The Hallway, Hyperactive Girl, Prime Spiral (kattis), Last Digit, Greg and Array, Balloon, Hide And Seek
- Div 2: Little Mammoth, Environment Protection, Dinosaur Menace, Prime Spiral (kattis), Last Digit, Hyperactive Girl, Exposing Corruption, The Art of Dealing with ATM, Counting Substhreengs, Greg and Array
-
Contest 4 [GRUPAL]:
- Fecha Inicio: 21 de Septiembre
- Duración: 38 días
- Link: https://www.codepit.io/#/contest/5b985bd76ea097002368c6e8/view
- Soluciones de ejemplo: Freight Train, Association For Cool Machineries (Part 1)[v1,v2], Growing Strings, Gates of Uncertainty, Eleven, Marblecoin, Join Two Kingdoms, Daunting Device, Limited Correspondence, Game of Matchings, CVJETICI, Lucky Number Representation, Lucky Common Subsequence, Gene Assembly, Who is The Boss, Arranging Tiles, Game of Tiles, Keep it Covered
- Links Contests UChile:
- South-America/South Regionals 2017: https://www.codepit.io/#/contest/5bb1163fb390c1001e1eaa7d/view
- Soluciones de Ejemplo: Arranging Tiles, Buggy ICPC, Complete Naebbirac's sequence, Daunting Device, Enigma, Fundraising, Gates of Uncertainty, Hard Choice, Imperial Roads, Keep it Covered, Marblecoin
- [CC4006] Taller 3: https://www.codepit.io/#/contest/5bca1aa3b390c1001e1eaf00/view
- South-America/South Regionals 2017: https://www.codepit.io/#/contest/5bb1163fb390c1001e1eaa7d/view
- AVISO: el tiempo límite del problema "Marblecoin" está mal configurado en LiveArchive (siempre tira TLE). Lo que pueden hacer es submitear su solución en el Gym de Codeforces
-
Contest 5 [GRUPAL]:
- Fecha Inicio: 24 de Octubre
- Duración: 37 días
- Link: https://www.codepit.io/#/contest/5bcff72bff0dd0001f220013/view
- Soluciones de ejemplo: Factors, Square Subsets (Por Martín Muñoz: Explicación, Sol. v1, Sol. v2)(Por Pablo Messina: link)
- ICPC Regional Latam 2018: http://codeforces.com/blog/entry/63157
- ICPC Chile - motivational - div0 (hard): https://open.kattis.com/contests/syiike
- T(A|C)P modo post-competencia:
- link: http://104.248.69.21/pc2team/Login/login.php
- deben loggearse usando: teamX (username) / teamX (password), donde X es algún natural entre 1 y 70 (inclusive)
- deben avisar qué teamX están usando
- deben publicar sus soluciones en internet (de preferencia, Github)
- el contest contará como bonus RPC