The USA Computing Olympiad hosts 3-problem, 4-hour contests for high school students. Contests are offered in four divisions (Bronze, Silver, Gold, and Platinum in increasing order of difficulty), four times a year. I’ve been a problemsetter for the USACO since December 2019.

Problem Proposal FAQs #

Can I propose problems for the USACO? #

Anyone, including current USACO contestants, can propose a problem. Though if you’re a current USACO contestant, we probably won’t use your problem if it’s for the division you are currently in or the division above that.

What sorts of problems can I propose? #

The International Olympiad in Informatics has three main task types: batch, output-only, and communication (source). Usually, USACO monthly contests only feature batch tasks since those are the easiest to prepare. Check the USACO website for examples of recent tasks, and the USACO Guide for an unofficial list of topics for each division.

How do I propose a problem for the USACO? #

You can email me a proposal satisfying the requirements below.

How do I prepare problems for the USACO? #

If you are out of high school and would like to help write statements, solutions, generators, validators, or analyses, please let me know.

Problem Proposal Requirements #

  • (Required) Problem credits
  • (Required) Anyone competing in USACO who has seen the problem and their divisions
  • (Required) Expected division and difficulty
  • (Required) A clear problem statement, preferably shared via Google Docs. HackMD works too, if you prefer markdown.
  • (Required) Constraints on the input
  • (Required) Sketch of the model solution
  • (Preferred) At least one sample case and an explanation
  • (Preferred) Code for the model solution
  • (Preferred) Input and output format
  • (Preferred) Scoring
  • (Preferred) Code for slow or wrong solutions
  • (Optional) Analysis (can be done after we decide to use the problem)
  • (Optional) Test generator
  • (Optional) Flavor text
How the Problem Statement Should be Formatted Source:
The input consists of two integers $M$ ($0\le M\le 1$) and $N$
($1\le N\le 10^6$), followed by a sequence of $N$ non-negative integers  each
less than $10^9+7$.

[ul]
[li]If $M=0$, output the sum of the input sequence modulo $10^9+7$.[/li]

[li]If $M=1$, output the sum of each prefix of the input sequence modulo
$10^9+7$.[/li]
[/ul]

[input]
The first line contains $M$ and $N$.

The next $N$ lines each contain an integer of the input sequence.
[/input]

[output]
As described in the statement. Print all integers separated by newlines.
[/output]

[example]

[example]

[section|SCORING:]

[ul]

[li]Inputs 3-7: $M=0$[/li]

[li]Inputs 8-12: $M=1$[/li]
[/ul]

[/section]

Common mistakes to avoid #

  • Typos
  • Including flavor text that makes the problem more difficult to understand.
  • Making the problem statement ambiguous enough to admit multiple possible interpretations and providing a sample case that doesn’t distinguish between them.
  • Forgetting to include constraints on the input.
  • \(\LaTeX\) mistakes:
    • Forgetting to enclose math in $…$.
    • Not including a backslash before operators such as $min$.
    • Not using \left(, \right) when larger parentheses are needed.
  • Making every sentence its own paragraph or condensing too many sentences into a single paragraph.
    • When in doubt, follow the format of past USACO problems (example).
  • Not being able to prove that the model solution works.

How to come up with problem ideas #

You can find articles about problemsetting at the end of the Codeforces catalog. In particular, I think methods 2, 3, 5, and 6 from this blog are all good ways to generate problems.

Here are some methods that have worked reliably for me: