# Home

These are my USACO notes from 3/10/2024 onwards.&#x20;

To speed up my acquisition of competitive programming skills, I want to start documenting my notes for each problem I come across and build intuition for problem-solving techniques. I also want to do my best to take away an improvement from each problem I do.&#x20;

These are completely inward-facing, and serves as an accountability measure to keep good documentation of the problems I do. A lot of the code implementations might not even work, because they will be me playing around with the official solution to understand why it works/re-implementing parts of the official solution after reading it. A lot of the times, I'll revisit problems weeks or months later, which is why some problems are mentioned twice, or don't have corresponding pseudocodes and implementations. In general, I'll also wait \~a week before re-implementing a problem after I've read the official solution, so that's why the latest problems probably don't have solutions yet.

Practice Approach (Inspired by <https://www.reddit.com/r/usaco/comments/pk3tjp/the_ultimate_usaco_practice_method/>):&#x20;

* Learn a little bit about and practice a few questions from each of the major topics on the [USACO Guide](https://usaco.guide/)
  * Stop once you can solve the easy questions from each topic
* Go through questions from previous USACO contexts
* Use the problem-solving approach below up to step 7
* Check the official solution
* Change your solution if necessary
* Implement your solution

General Problem-Solving Approach:

1. Read through the problem
2. Try to observe some patterns while solving the sample test cases&#x20;
   * If you can think of a great solution right off the bat, skip to step 5&#x20;
3. Ignoring the time complexity, think of the most simple solution possible and plan it out completely
4. If that solution isn't optimal, bookmark it and then try to see if you can optimize it in any way AND/OR look at the subtasks and see what they might provide insight into more optimized solutions
5. Once you have a solution, test it yourself with a few hand-generated test cases. Try to break your solution.
6. Write a description of the solution down
7. Write out detailed pseudo-code that is just advanced enough that you could implement it even without knowing what the problem is
8. Flesh that out into code
