Nathan, a 4 time USACO Finalist and a USACO Guide developer, reveals how he prepared for USACO

Here’s the full video where I discuss the same content in detail: ”Nathan, a 4 time USACO Finalist and a USACO Guide developer, reveals how he prepared for USACO!"

I recently had the privilege of sitting down with Nathan Wang, a four-time USACO finalist and a USACO Guide developer. Today, we will delve into his remarkable journey through the world of competitive programming.

Introduction

Nathan Wang's journey through the world of competitive programming is nothing short of extraordinary. He has not only achieved the remarkable feat of becoming a four-time USACO finalist but is also a prominent figure within the USACO community. Beyond his impressive competitive achievements, Nathan has played a central role in the development of the USACO guide, a valuable resource for aspiring coders seeking to navigate the challenging waters of competitive programming. Nathan's story is a testament to dedication, passion, and the relentless pursuit of excellence in programming. 

Starting Out

Nathan's fascination with programming began long before he was introduced to USACO. He started programming at a young age, and by the time he reached seventh grade, he was already deeply involved in web development, which he did recreationally.

However, it was only in middle school that he stumbled upon USACO, thanks to his older brother. Intrigued, Nathan decided to participate in his first USACO contest. Surprisingly, his prior programming experience enabled him to excel. The bronze-level contests back then were not as challenging as they are today, which worked to Nathan's advantage. However, on his very first try, he managed to promote himself all the way to the gold level, which still demonstrated Nathan’s immense talent and impressive programming and problem-solving skills.

His Journey to Platinum

Nathan admitted that his journey from gold to platinum wasn't solely backed by rigorous study sessions. In fact, he attributed his advancement to a combination of luck and his foundational knowledge in programming. There was a particular contest where a problem was flawed, and Nathan was among those who managed to solve it before it was removed. This, combined with his scores from other problems, allowed him to advance, even though his solution wasn't entirely correct.

However, luck can only take one so far. Recognizing that he wasn't truly at a platinum level, Nathan decided to invest in his training. He enrolled in a summer program for USACO and honed his skills by solving numerous old USACO problems from the usaco.org website. He believed that continuous practice was key to acquiring the necessary skills to genuinely qualify for the platinum level.

Preparing for Camp

Transitioning from platinum to camp level required Nathan to immerse himself in rigorous practice sessions. He emphasized the importance of mastering foundational concepts like Dynamic Programming (DP) and other algorithms. Nathan’s strategy was straightforward – he tackled old USACO problems, with a focus on the gold and platinum problems to solidify his understanding. In fact, the summer before the season where Nathan went camp, he solved almost every single gold and platinum problem from past contests!

When going through the old problems, Nathan simply went down the list, from the oldest contests to the newest contests. However, one strategy I recommend employing when working on Platinum problems is to sort them based on the number of people who solved them. By reviewing the results, you could prioritize problems with the highest number of solutions first and gradually tackle those with fewer solutions. This method is not perfect, as the difficulty between contests could vary, but it provides a reasonable estimation.

Getting unstuck

Whenever Nathan confronted a problem he couldn't solve, he'd read the solution, ensuring he coded it himself to grasp the concept better. He would spend hours analyzing the often-cryptic solutions, and scour through the code again and again, trying to understand what it was really doing. If a problem was simply way too hard, he would give up and return at a later time. 

Nathan emphasized the importance of persistence, advocating for continuous effort unless one felt utterly stuck. For those who encounter frequent obstacles, he suggests leveraging resources like the USACO forum, a place where one can post questions and receive answers from others in the community. Asking others who are more experienced can really help you get unstuck or even help you see another perspective if you are unable to figure out a problem or understand a solution. 

In the end, Nathan’s priority was to enjoy the process and remain motivated. Participating in USACO was always a highlight for him. During the summer, he would sometimes spend entire weeks just preparing for it.

Nathan’s First Camp Experience

Upon qualifying, Nathan described his experience at the USACO camp as transformative. Before attending, he had considered his journey in competitive programming to be near its end. However, the camp reignited his passion. It was more than just about algorithms and contests; it was a social event. Nathan had a chance to connect with like-minded individuals, learn new concepts, and engage in fun activities like board games.

The camp organizers efficiently split the attendees into two groups – Guernseys and Holsteins. Guernseys consisted of the first-time campers, whereas Holsteins consisted of the returners, who were at camp to compete for a spot on the United States’ International Olympiad of Informatics team. This allowed for a more tailored experience. Nathan, being a Guernsey, had more time dedicated to learning and social activities, making his overall camp experience highly enjoyable, and even the best week of his life up to that point. 

Preparing to return

Returning to USACO camp as a Holsten is much more challenging than reaching camp for the first time, as you are competing to be a candidate for the IOI team. After his first year at camp, Nathan initially didn’t have many expectations and dreams - he was doing USACO and wanted to attend camp mostly for fun. 

However, during camp, a friend Nathan met at camp, who introduced him to a coach. This coach, offering a free service that aspiring competitive programmers could apply for, proved to be a game-changer for Nathan. Eager to seize this opportunity, he wasted no time in enlisting the coach's guidance.

The coach put together problem sets for Nathan to practice. The problem sets were carefully curated, primarily consisting of old Olympiad problems that closely mirrored the difficulty level of the hardest platinum-level USACO problems. The coach's knack for selecting problems that pushed Nathan's limits and providing clear, easy-to-understand solutions was instrumental in driving Nathan's progress.

One key attribute that set Nathan apart was his unwavering motivation. He understood that motivation was essential for continuous improvement. Whenever he encountered a particularly stubborn or frustrating problem, he had a unique approach. Instead of getting stuck for days on end without giving up, he would pivot to a different topic or problem sooner than most would. This strategy, driven by his desire to stay enthusiastic and maintain the joy of practicing, proved to be highly effective.

Nathan's relentless dedication, fueled by his motivating coach and his own intrinsic passion, ultimately paid off. Through his relentless efforts and determination, he secured his place at the USACO camp for a second time, returning as a Holstein.

Continuing to Prepare

At the highest levels of competitive programming, success hinges on one crucial factor: practice. It all boils down to who has devoted the most time and effort to solving a wide array of challenging problems. After mastering the essential algorithms and data structures that could potentially be encountered in competitions like the USACO, the real distinguishing factor becomes a contestant's problem-solving prowess.

Thus, between his second and third appearances at camp, Nathan similarly delved into a mix of old Olympiad-style problems, often under the guidance of the same trusted coach. This continuity in his training regimen allowed him to build on his existing foundation, refine his problem-solving strategies, and cultivate a deeper understanding of the intricacies of competitive programming.

Nathan’s Time Management

Finding time for USACO was never a challenge for Nathan. He never felt overwhelmed with schoolwork and didn't have many extracurricular commitments, as he focused all his energy on USACO. During summers, he opted out of summer programs, freeing up more time for preparation. Even during school hours, if a lecture wasn't captivating his attention, he would mentally work through problem statements he had read earlier. The benefit of this was that even without pen and paper, he could mull over a problem. It became a habit; whether he was eating dinner or in the shower, there was often a problem he was pondering over.

Others have shared similar experiences, bringing printed problems to class only to have them confiscated. But once you memorize the problem statement, no one can stop you from thinking about it. Of course, be sure to respect the teachers and their classes, but if you have a moment or two, why not problem solve?

The Long-term Value of USACO

Regarding summer activities, while many students feel pressured to join recognized summer camps or prioritize other extracurriculars, Nathan personally prioritized USACO. A key factor for him was seeing the long-term value in USACO. Even if he didn't make it to camp, the skills he honed would be invaluable during job searches or internships. Technical programming interviews become significantly easier with the preparation one gets from USACO. It felt like a win-win. Even if he didn't get selected for camp, the skills he gained would make future technical interviews a breeze.

Many have echoed this sentiment. A student mentioned that one of his college courses at Berkeley was primarily about algorithms and problem-solving, and thanks to his preparation, he breezed through it. This highlights USACO’s practicality as an extracurricular activity. While math competitions have their value, they often lack direct practical application. That's one reason Nathan transitioned from math competitions to computer science - advanced math wasn't as appealing to him, and he didn't see its direct practicality. With USACO, he felt he was investing his time wisely, especially since he enjoyed it more.

Furthermore, once you reach a certain division in USACO – whether that's platinum, gold, or silver, depending on your personal goals – you can take the next summer to relax a bit and focus on other extracurriculars. In the context of college admissions, once you achieve a division, you're there forever; you don’t need to maintain your skills. If you qualify for Platinum once, it's there for life, whereas with AMC or AIME, you must continuously qualify.

The USACO Guide

Nathan was in his second year when he started the USACO Guide. His motivation to create the guide stemmed from the existing training pages looking outdated, and wanting to modernize this excellent resource. The idea eventually evolved, and instead of just updating the old training pages, Nathan and his team decided to start from scratch, leading to the USACO guide. By creating his own resource, he had greater flexibility; he could move faster and iterate more quickly. The USACO guide provides a structured set of problems based on topics, making it easier for users to work on areas they're struggling with.

However, while it is called the USACO guide, why are most problems in the guide not from USACO? The goal of the USACO guide is to equip users with algorithms necessary for each division, and sometimes, these algorithms are best trained through repeated practice. Thus, doing additional practice outside of just USACO’s past problems is incredibly beneficial.

For the Platinum division, unlike the other divisions, there is a much more extensive range of topics. However, don’t be intimidated, as even Nathan didn’t memorize all the topics and algorithms. In fact, it is often more time efficient to practice topics that will come up more often, such as dynamic programming, rather than spending time learning obscure techniques that will rarely show up. For dynamic programming in particular, you can always get better and better at it, so it will always be time well spent to practice dynamic programming. 

In general, the USACO guide is meant to provide a foundational understanding, while your skills are meant to be developed through rigorous practice. It’s essential not to get demotivated if unfamiliar topics arise, and in general, prioritize dynamic programming since it's a versatile topic that frequently appears.

How to Most Effectively Use the USACO Guide

For those just starting out in a division, Nathan doesn’t recommend simply going down the list in the USACO Guide, doing all the problems in each category in order. This is because you lose out on vital problem-solving practice. By knowing which category of problems you are doing, you lose the need to come up with the fact that the problem uses that algorithm/data structure. For example, if you are in the “binary search” section of Silver, you automatically know the problems in that section use binary search, whereas in an actual contest, you will not have the information and might miss out on a problem you would otherwise be able to solve.

Instead, Nathan recommends 2 ways to effectively use the USACO Guide. The first way is applicable to those who are already proficient in most topics covered in a division; if there is a particular algorithm/data structure that you lack confidence in in your division, doing the targeted practice in the USACO guide can be incredibly useful and the most efficient way to practice.

The second way is applicable to those who are just starting out in a division. Before you jump right into a divisions’ problems, Nathan recommends learning all of the algorithms from the USACO Guide. Then, after you have a grasp of all the fundamental algorithms and data structures covered in the division, do practice on random problems from the past USACO contests. This avoids the tedious situation where you spend hours and hours on a problem, trying to figure it out, only to realize it simply uses a technique you have never seen before, but still ensures that you get practice in problem-solving. 

Nathan’s Advice for Those Preparing for USACO

Stay motivated. For Nathan, fun and enjoyment were paramount when solving USACO problems. He believes improvement is directly proportional to the number of problems you tackle. Rather than overthinking performance, focus on staying motivated and enjoying the learning process.

How You can Emulate Nathan’s Results

Nathan’s journey is defined by two major factors: repetition, and motivation. If you are able to solve thousands of problems while effectively learning from each and every one of them, you, too, will be able to accomplish what Nathan did. However, it is much easier said than done, so how do you do it?

First, repetition. Doing many practice problems and practice contests are the key to success in competitive programming.

  • Where can I find all these practice problems? USACO barely has a few hundred!

    • Fortunately, Codeforces has a problem library of around ~10,000 problems that you can practice with. For the most effective practice, do problems with difficulties just above your skill level. To help choose problems, Codeforces allows you to filter the problem set for certain difficulties. As a general guideline, Bronze problems are around 800-1400, Silver problems are around 1500-2000, Gold problems are around 2100-2500, and Platinum problems are 2500+. However, you should try out the problems for yourself, and measure which difficulty is appropriate for you, regardless of division.

    • Codeforces aside, there are many other online competitive programming platforms that offer a versatile problem set, such as LeetCode and CSES for more standard problems, CodeChef and AtCoder for problems similar to Codeforces’ style, and online judges like oj.uz for Olympiad problems similar to USACO’s style.

    • Additionally, like Nathan, you could invest in a coach or an online course. These external resources are incredibly useful for not only helping you learn competitive programming, but also selecting appropriate problems, tailored to your current level.

  • What about practice contests?

    • Many of the aforementioned online platforms offer amazing live contests. Codeforces, LeetCode, AtCoder, and CodeChef all offer contests at least once a week, which are great for practicing your problem solving skills under pressure. Furthermore, these sites have rating systems as well, allowing you to measure your progress and growth.

    • If you have leftover USACO problems that you have not looked at, doing a practice contest with those problems can often be the sole best way to practice. Emulate a contest setting and try your best to solve 3 problems from your division, and you can effectively measure where you are at.

  • How do I find the time?

    • If you are truly dedicated to improving at competitive programming, you can always find the time to squeeze in an extra problem. Like mentioned, an effective way to create more time for problem solving that Nathan uses is to always have a problem in mind that you are thinking about. Read a few problem statements, and ponder these as you go through your day while doing monotonous activities.

Second, motivation. It’s easy to burn out doing competitive programming if you do thousands of problems in a short time period. How do you stay motivated, especially during the March-December period when there are no contests?

  • One way to stay motivated is to participate in live contests on sites like Codeforces. Competing is always more exciting that just practicing, and while doing problems in a contest, 2, 3 hours can fly by quickly. Even practice contests are very effective, as a time limit will often push you to solve a problem, giving you more concentration. Also, seeing your rating grow on sites like Codeforces can also be a big motivator, as you know you are getting better.

  • Another way to stay motivated that Nathan applied is to not get stuck on a problem for too long. Having a problem that you just cannot find the solution to no matter how many hours, days, weeks you spend on it can be incredibly demotivating, so it is often better to simply skip it. Of course, still spend sufficient time thinking about a problem before you skip it.

Conclusion

As you embark on your own journey in competitive programming, remember that every challenge you face is an opportunity for growth. Nathan's story is a testament to the power of persistence, dedication, and a genuine love for problem-solving. So, as you navigate the world of USACO, may his insights and experiences serve as an inspiration for your own path to success.