| Phase | Main Topic | Practice Problems | Goal |
|---|---|---|---|
| 1 | Ad-Hoc Problems (Getting Started) |
|
Get familiar with the judging system and basic problems. |
| 2 | Math |
Number Theory:
|
Apply mathematical concepts to solve problems. |
| 3 | Binary Search |
|
Master the binary search on the answer technique. |
| 4 | Data Structures & C++ STL |
Standard Template Library (STL):
|
Efficiently use the standard library and complex data structures. |
| 5 | Graph Traversal (DFS/BFS) |
|
Master basic graph traversal algorithms. |
| 6 | Disjoint Set Union (DSU) |
|
Understand and apply DSU for set-related problems. |
| 7 | Backtracking |
|
Solve global search problems using backtracking. |
Core Mindsets for Competitive Programmers
1. Deconstruct and Conquer
Break every complex problem into the smallest, simplest sub-problems. Solve simple cases first (e.g., for n=1, n=2) to build intuition before generalizing.
2. Recognize the Underlying Pattern
Most problems are variations of a known pattern or algorithm. Ask yourself: "Is this a sorting problem? A graph traversal? A dynamic programming problem in disguise?"
3. Constraints are Clues
The constraints (e.g., N <= 10^5) are a huge hint about the required time complexity. They tell you whether an O(N^2) solution is too slow and if you need an O(N log N) or O(N) approach.
4. Practice Deliberately (Upsolve)
Don't just solve problems you already know how to solve. After a contest, upsolve: spend time understanding and implementing solutions for the problems you couldn't solve.