Any advice on teaching USACO

I’m a professional programmer and I decided to move into teaching USACO about a year ago. I’ve had many students come to me, mostly beginners who’ve had no prior USACO experience. I’ve worked closely with them and seen them grow better.

The average length of time I’ve worked with them is 6 months. They are all in the 9th grade or younger. Most of them had prior tutoring and say that I’m much better at working at their level and explaining things than previous tutors or the courses they’ve taken on AlphaStar. Some of my students have come to me after doing the AlphaStar Bronze course and I can see that their programming skills are chaotic and over-complicated, so I work with them on writing concise code.

This year’s Bronze test seems to be exceptionally hard. Most of my students only got a few test cases right over all the questions. I had one parent come to me and say “Why is it that the USACO Guide-based course (the non-profit one) claims you can prepare for Bronze in 8 weeks, and AlphaStar practically guarantees they’ll get you through Bronze after one course, yet my child only got a few test cases right after 6 months of study with a private tutor?”

Honestly I don’t know how my students could have done better. They are still working on programming skills that would seem basic to most successful USACO competitors. They don’t necessarily practice every day. I can see them improve dramatically, say gain the ability to do 1000-level Codeforces problems after starting more like the 800 level. But to do this year’s Bronze test would require far more advancement in creative thinking abilities.

Yet I see clearly that these bootcamps and courses promise high achievement after one course. I’m kind of doubting myself a bit, wondering if I’m really not getting how to teach these students.

Am I doing something wrong? My students don’t practice every day… is that the entire reason they’re not making good progress? Or am I doing something wrong?

Or do the students that pass Bronze on the first try after a bootcamp… well are they especially gifted either mentally or with a surrounding culture that has encouraged and taught them since day 1 (say parents who taught them to code in 4th grade, or a magnet school with many fellow students working on the same skills)? My students aren’t in magnet schools.

I’m not a USACO finalist. I only picked this up a year ago after my prior experience with programming in the workplace. I got 100% on this year’s Bronze, and I can do very well on Silver problems from a few years ago, but more recent Silver problems are still above my level. I plan on passing my students along to better teachers as soon as they pass Bronze. I think that given the issues they are struggling with, I can still help them for a while. I’m a very good teacher in general and they like me a lot. I think I’m pretty good at bringing out creativity. So I do think I can help them still.

Any advice is welcome.

I can’t comment much about how to teach effectively, but some things:

I see clearly that these bootcamps and courses promise high achievement after one course.

It’s impossible to guarantee success from any course. When we claim “you can prepare for bronze in 8 weeks,” this requires that students are also willing to put in the effort. The claim is moreso that we will provide the resources and assistance needed for a student to pass, but it’s ultimately up to them to do practice problems and get better.

this year’s Bronze test would require far more advancement in creative thinking abilities

Yeah, I think Bronze has exceeded 1000-rating on Codeforces nowadays. Codeforces is probably not the best platform for practicing, so if there are past Bronze problems that you haven’t worked through, I think those are a better starting point.

My students don’t practice every day… is that the entire reason they’re not making good progress.

I’m not sure. I’ll say that after six months of somewhat-consistent practice, most students I know would be able to pass (last years) Bronze. I haven’t looked at this contests problems, but unless there was a spike in difficulty, it’s probably an issue with how they’re practicing.

How often are they reading solutions? When they do, are they taking time to reflect on the ideas they missed and how they would get to that solution next time? Which problem sources are they doing practice on?

Overall, I can’t answer this without knowing how much they practice and where. Linking some Codeforces or USACO Guide accounts would be helpful.

are they especially gifted either mentally or with a surrounding culture that has encouraged and taught them since day 1

Sometimes, yeah, they’re really gifted / have a background in stuff like competition math. But that’s usually more of a factor at higher levels of competition.

I got 100% on this year’s Bronze.

I think it’d be good for you to go over the contest with students. Not just go over the solutions, but also how you arrived at them (ex: rather than saying “brute force” say something like “in contest, I noticed the bounds were N \leq ... and so I realized you could brute force.”)

One more thing I’ll note is that it’s entirely possible that students have a solid grasp of the concepts but have poor in contest strategy. See:

It might also be good for you to take a contest sometime by yourself and keep a “contest log” of what you do (or maybe even a screencast), and then go over it with students.

I hope you find success. Hopefully, these suggestions are useful. Good luck!

A excellent place to start is to look at prior contest problems on the USACO website by clicking here. Students that sign up for an account have access to more practice problems. Areteem offers a variety of programs that assist students in developing the foundation and problem-solving skills required to compete in USACO contests.

@Jean_Davis Do you run a program? Is the phrase “Areteem” supposed to be “Our team” or is this a word I don’t know? If you run a program any additional information would be helpful.

@caoash Thanks for the reply. I do work old USACO problems with them and work through the USACO guide. We don’t just do Codeforces. However I have noticed there are only a few Bronze USACO problems that are easy for beginners to get, and then there’s a bit of a breakpoint where everything above that requires a true creative insight or deep programming experience, and my beginner students just don’t have enough experience to get it on their own. I still do take them through problems and the solutions. I work with them on understanding the solution and why it is so compact and how they can write compact code like that on their own. And they are making progress.

Codeforces 1000 problems seem to be a good intermediate between the easier Bronze from past years and the harder Bronze that require more creative thinking. I have one student who thinks very clearly now about time complexity and he developed that while working Codeforces.

When you say 6 months should be enough time to qualify for silver, what I keep thinking of is … the question of how much experience a student has before they start that 6 months. Starting with no knowledge of programming, I don’t think 6 months is realistic except in the case of exceptional talent and a highly supportive environment. I do have one former student who passed the 2020 Bronze (which I think was easier to pass than this year’s) a year after starting to code. His brain was like a deep learning neural network, just absorbing knowledge and strategy like pulling it out of the air. Most of my students just don’t have that level of talent. I’m a believe in never putting a student in a box and giving everyone a chance to flourish, but sometimes I see a student making fast progress with only a little teaching and I wonder about raw talent.

But even this talented student wrote excessively complex code. Most of his solutions were 3 times longer than necessary, so of course he struggled with Silver. He took the AlphaStar course and came out of it with better knowledge but still writing massively overcomplicated code.

With all my students we go over asymptotic time complexity and what algorithms are applicable with an eye on the problem size. Even my 8th grader is pretty good at that. But they struggle to catch hidden time complexity. For example they will use the “indexOf” method of an ArrayList and not realize it’s O(N). And they don’t always remember this; they might make the mistake again. I think this is partly a result of not practicing consistently and just not paying enough attention, just not being totally attuned to competitive coding like I’m sure you were from the beginning (if you reached Platinum you must really love it and really deeply care about learning - even my most dedicated students have a lot of other activities and don’t have time to practice every day and keep forgetting stuff.)

I realize that no one can or should make guarantees, but I’ve had two students come to me who got a very clear impression from AlphaStar that if you take their course, you can pass Bronze. That it’s just a matter of taking their course. I don’t know if there are any disclaimers that the parents aren’t telling me about, but you can see that they are concerned their kids didn’t do well on this year’s Bronze test after 6 months or so of study with me.

From your point of view, a platinum competitor, the days of first learning to write a nested loop correctly (or any other of a thousand beginner ideas) are long past, but remember that for many of my students, that day was not long ago.

Given all of that, I’m still willing to adjust my approach if it can help my students. I think I might focus more on getting through the entire USACO guide and letting them struggle for less time… just a couple hours rather than a couple days… before analyzing the official solution.

Additional thought: I just saw one student who says he got almost 2/3’s of the test cases right. Turns out his code wasn’t very efficient. He did problem 3 with recursion, and got all the test cases right, even though the time complexity of recursion on this problem is exponential. So I’m rethinking about how hard this year’s bronze test is. They must have given small problem sizes for the test cases. That’s one way to make it easier.

Sometime instead of finding the most efficient solution, finding a solution that fits the bounds is just as good. And example of this is this problem;

When you say 6 months should be enough time to qualify for silver, what I keep thinking of is … the question of how much experience a student has before they start that 6 months. Starting with no knowledge of programming…

Yeah, completely agree. I was more so talking about a student who had some fundamentals in programming (say, passing APCS).

if you take their course, you can pass Bronze

I think that’s an advertising strategy more than an actual guarantee. They’ve done it for quite a while, and have had success, so I can’t really speak to whether the guarantee is true. I never took an a-star bronze class. However, I’ll say that students who take a-star courses tend to succeed not solely because of the courses, but because they put a lot of time and practice in outside of them.

the days of first learning to write a nested loop correctly (or any other of a thousand beginner ideas) are long past, but remember that for many of my students, that day was not long ago

Definitely agree. That’s partially why it’s harder for me to comment because all I can say is that “in retrospect, I should have done X, Y, Z”. I don’t know the students individual needs or abilities, so maybe the issue is something I’m missing entirely that won’t be solved with more practice.

struggle for less time… just a couple hours rather than a couple days… before analyzing the official solution

Worth a try! I know some contestants love practicing this way (some platinum competitors read the solution after ~20 minutes) and others hate it.

I just saw one student who says he got almost 2/3’s of the test cases…

I’d have to see the contest to know, but typically you don’t worry too much about bounds in Bronze. If you check USACO Guide, a lot of the topics involve algorithms that run with bad time complexity (complete search, recursion, etc.).