In January of this year, Jasmine Chen (lnishan) published a Codeforces blog post called An awesome list for competitive programming! Since then, she and a few collaborators have been editing and expanding the list on GitHub.
Awesome list in this context doesn’t just mean “a really great list.” It refers to a project started by Sindre Sorhus in which people create lists of links to useful and/or interesting resources, and publish them on GitHub. There is of course a list of these lists.
Here’s what the Awesome Competitive Programming list offers.
Principles
The guidelines for contributing to this awesome list specify that it is “a curated list.” In other words, “it’s not a complete catalogue of everything.”
It’s tempting when making a list of Internet resources to include everything on a topic. But that’s Google’s job. I subscribe to a Google alert for the phrase “competitive programming,” so I see every reference to the topic. I can tell you that the quality of the writing on that topic is uneven. So it’s useful to have a list that filters out sub-par resources.
The list is split into the following sections (some of which I have renamed):
Reference Materials
Algorithms and Data Structures
To learn algorithms and data structures, you can do what generations of students have done, and read a textbook. To that end, there is a book section farther down on this list. But the first section on the list is a set of less traditional resources: information on algorithms and data structures, written by competitive programming practitioners, and published online.
The weakness of these types of resources is consistency and writing quality, since they aren’t professionally edited. But it can be useful to get a competitive programming perspective on algorithms, rather than the traditional computer science and math perspective provided by a textbook like CLRS. Online competitive programming algorithms resources tell you where to focus your learning efforts for maximum benefit in coding contests, while algorithms textbooks use a more general approach in selecting their content.
I would recommend using these references as you need them, rather than just reading through them. In other words, find a problem that requires a particular algorithm, read about the algorithm, and solve as many problems as necessary to solidify your understanding of it, reading more as necessary. Then move on to the next algorithm or technique.
Syllabuses
As most students know, a syllabus is an outline of the topics covered in a class. Since programming competitions cover a subset of all possible programming topics, syllabuses are useful for focusing your study efforts on which topics are most important. For example, this section of the list includes the official International Olympiad in Informatics Syllabus, which lists the topics that IOI hopefuls must study.
List of Lists
This section is a lot like the Algorithms and Data Structures section above, in that it includes links to online resources covering those areas.
Implementations / Notebooks
A competitive programming notebook is a collection of code and other notes to be used when solving contest problems. Some in-person contests allow contestants to bring printed versions of their notebooks with them.
As the list says in this section, “It is advised that you write yours first before looking at others’.” Not only is it a critical learning experience to create your own notebook, but you’re more likely to be able to find what you need quickly if you wrote it yourself.
Once you’ve created a few drafts of your own notebook and have spent some time using it, looking at a notebook written by a more experienced competitive programmer can give you some ideas about areas you may have missed.
Language Specifics
As with algorithms and data structures, there are a lot of general resources for learning to program, but there are benefits to using ones written by competitive programming experts, since they emphasize the right areas. For example, some of the resources in this section focus on writing efficient I/O code, which can be tricky to get right in contest solutions.
This section focuses on C/C++ and Java. C++ is by far the most popular language in competitive programming, and Java makes up most of the rest of the total usage. Here’s one source: in 2015, 86.5% of Codeforces submissions used C++, and 6.2% used Java, leaving just 7.3% for all other languages. And the trend is towards more C++ usage over time.
IDEs
Developers can be picky about their editor and IDE choices and often have one they prefer. Nevertheless, this section has a list of most of the common IDEs, along with some notes about competitive programming options like the CHelper plugin for IntelliJ IDEA.
Other coding tools
This section includes tools for visualizing algorithms, parsing problem statements, formatting and sharing code, finding known integer sequence, and grading submissions locally.
Contest tools
The tools in this section are for creating and running programming contests (as opposed to participating in them as a contestant).
Learning Materials
Open Courses
Some students are lucky enough to find a competitive programming eam in college, or even high school. These teams often come with a coach who has years of accumulated experience from past contests. But if you’re studying on your own, this section lists a number of online courses covering the fundamental topics for starting out in competitive programming.
Open Courses for Algorithms and Data Structures
While it’s worth taking a course specifically about competitive programming, there’s an even larger number of courses that cover the algorithms and data structures content found in a standard Computer Science curriculum. These are especially useful if you don’t have a CS degree, since you can pick up topics you may have missed in college.
Books
The two well-known English language books about competitive programming are CP3 and Programming Challenges. In addition to those, this section lists free ebooks, Competitive Programming books in other languages, and standard math and algorithms textbooks.
For mainstream topics in math and algorithms, the advantage of a book over an online source is editing and quality control. If you’re studying a topic that is covered in CLRS, and you have access to that textbook, you might as well start there.
Sites to Practice
This section lists online judges, both well-known ones and some up-and-coming new ones. Online judges are key to executing any competitive programming learning plan. None of the other resources on this list will help you much if you don’t solve and submit a lot of solutions.
Problem Classifiers
The resources in this section are used for finding problems in a particular category. Practicing several problems of the same type is more efficient than practicing miscellaneous problems, since you can focus your learning efforts more precisely. For best results, combine one of these classifiers with one of the algorithms resources. Read about an algorithm, and then use a classifier to find relevant problems.
Contest Calendars
If you’re interested in real-time programming contests, the resources in this section keep track of when they are scheduled.
Sites to ask Questions
Quora is in this section, of course, though Stack Overflow doesn’t currently make an appearance.
Community
Blogs
There are surprisingly few regularly-updated independent blogs about competitive programming. Most people choose to write on existing sites like Quora or Codeforces.
Youtube and Livestreams
Yes, you can actually watch other people code on Youtube and Twitch. It’s probably best to set your player to 2X speed, and even then I’m not sure it’s a good use of your time when you could be reading completed solutions instead.
Quora
You can spend hours on Quora reading about competitive programming. This section of the list focuses on Quora writers to follow, which I have found is a good way to track down good content. The Competitive Programming topic tends to attract a lot of low-quality questions and answers, which you can avoid by reading answers by authors who are known to write well.
Other Resources
Articles
This section links to a few miscellaneous articles.
FAQs
These FAQs are all from Quora.
Lists
These are lists related to math and programming. Some are Github-hosted “awesome lists” as defined by Sindre Sorhus. Others are from Quora and Stack Overflow.
Interview Questions
Competitive programming and coding interviews have a lot in common, and people are often interested in the former as a way to prepare for the latter. This section lists a few resources related to coding interviews.
Thoughts on the Awesome Competitive Programming List
When you’re studying competitive programming, it’s tempting to keep looking for the perfect resource that will tell you exactly how to become a superstar. That’s why the What is the best strategy to improve my skills in competitive programming in 2-3 months? question on Quora has over 100 answers, and yet people keep asking essentially the same question. (I know this because I have merged a lot of those questions).
Readers of the Awesome Competitive Programming List may therefore be looking for a resource that has somehow slipped by them, and that they can use to shift their preparation efforts into high gear. And there are a lot of great resources on the list: Topcoder tutorials, online courses, classic algorithms textbooks like CLRS and Sedgewick, and all of the top online judges.
So it’s worth reading through the list and trying out the resources that look like they will fit your learning style. But the key is to stick with your choices. Putting a lot of effort into a moderately good online resource will help you more than occasionally leafing through CLRS. The best course won’t teach you much unless you spend time doing the homework. The best textbook can be incomprehensible in later chapters (especially for math and computer science) unless you actively study on earlier chapters — e.g., by solving problem sets. And the best online judge will only frustrate you unless you methodically work through problems at the right level for your current skills.
A single resource can take months or years to complete. In the case of an active online judge, there’s a never-ending influx of new problems to challenge even the top competitive programmers in the world. So keep an eye on the Awesome Competitive Programming List as it gets refined over time and new resources appear. But stick to your plan and don’t get distracted by shiny new websites, even if they look useful.
My (ongoing) plan:
- Read CP3.
- Work on the starred problems on uHunt.
- Research anything I find tricky.
- Write about interesting problems here on the blog.
(Image credit: Sindre Sorhus)