I’m working on a project this year to build a competitive programming FAQ. This is one in a series of articles describing the research, writing, and tool creation process. To read the whole series, see my CPFAQ category page.
As I mentioned last week, I have been writing and categorizing canonical questions for the FAQ. In this week’s post, I’ll describe the categories I have so far.
I have written before about collecting, cleaning up, and classifying topics in the Quora topic ontology. Although I think I’ll be able to improve the QTO using my ongoing categorization work, there are a few differences between Quora topics and the categories described in this post:
- Although Quora topics are arranged in a hierarchy, child topic names often include the parent topic name or other identifiers. For example, Algorithms in Competitive Programming is a child topic of Competitive Programming. They can’t just name it Algorithms because there’s already a topic with that name. For my purposes, I don’t have to worry about disambiguating my topic names, since they’re all implicitly related to the master topic of Competitive Programming.
- Quora topics can be nested to (as far as I know) any depth. For my categories, I’m sticking with a fixed four-layer depth: the implicit master topic (competitive programming), the primary category (described below), the canonical question title, and the Quora question title.
Primary Categories
A Primary Category is the main topic of a question. Although questions often address multiple sub-topics, I’m selecting one as the main topic. Here’s the list of primary categories, with the scope that each one covers, example questions, and notes about when to choose one category over another. Where applicable, I also list the corresponding Quora topic.
Algorithms
Quora topic: Algorithms in Competitive Programming
Scope: Algorithms (e.g., binary search), data structures (e.g., tree), and techniques (e.g., dynamic programming) for solving competitive programming problems.
If a question asks for a list of problems that use a particular algorithm or data structure, it belongs in the Problems category rather than this one.
Questions in this category cover areas such as learning a specific algorithm or technique (How can I get good at dynamic programming?), getting better at algorithmic thinking in general (What can I learn right now in just 10 minutes that could improve my algorithmic thinking?), and deciding which algorithms to learn (What are the algorithms required to solve all problems (using C++) in any competitive coding contest?).
Books
Scope: Books to use while studying competitive programming. Books in this category may be specifically about competitive programming (e.g., Competitive Programming 3), or about related topics like algorithms (e.g., CLRS) or mathematics (e.g., Concrete Mathematics).
Example question: What are some good books for competitive programming?
Coaches
Scope: Competitive programming coaches — finding a coach, coaching a team, the role of coaching, and the coaching process.
If the question mentions a specific person who happens to be a coach, the question should go in the People category. If the question is not about a specific coach, but asks how coaches approach some other topic (like algorithms), then it should go in the category related to that topic.
Example question: Where can I find a competitive programming coach in Latin America or via the internet?
Competitive Programming vs. Professional Programming
Scope: Comparing competitive programming with professional software development.
Example questions:
- How is competitive programming different from real-life programming?
- Which is better to invest time in: competitive programming (algorithmic programming on websites like CodeChef or TopCoder) vs. software development (app dev, web dev etc.)? Why?
Contests
Quora topic: Competitive Programming Competitions
Scope: Programming contests with a specific start and end time, held in person or online.
This category is closely related to Online Judges, since several major online judges also host programming contests. Questions about a specific contest, even if hosted by an online judge, belong in the Contests category. The Contests category also clearly applies to questions about contests like ACM-ICPC or Google Code Jam.
Example question: What is a good way to prepare for Google Code Jam?
Courses
Scope: Courses to take while studying competitive programming.
Example question: What is the best online data structure and algorithm MOOC, or course in C or C++?
General
Scope: Competitive programming in general, not any particular topic related to competitive programming.
Example questions:
Getting Better
Quora topic: Training for Competitive Programming
Scope: Improving competitive programming skills.
This is the subtext of almost every category in this list, but people sometimes just ask about it directly.
Example questions:
- How can I be a red coder on TopCoder?
- What can I do to get better at algorithms? I’m a pretty good programmer, I use LeetCode, and I’ve tried implementing data structures in languages. What more can I do?
- What is needed to become good algorithmist like top rankers in Topcoder/Spoj/GCJ?
Getting Started
Scope: Getting started with competitive programming.
This category is for questions whether the author identifies as a competitive programming novice.
Example questions:
- How do I learn competitive programming as a beginner?
- How does one start with TopCoder?
- In what order should I learn algorithms as a beginner competitive programmer?
Interviews and Jobs
Quora topic: Programming Interviews
Scope: Programming interviews, online interview sites, and using competitive programming to prepare for programming interviews.
Competitive programming is useful for many reasons, but the most popular reason is getting a software job. The similarities between programming contests and programming interviews are just too clear to ignore, even if studying competitive programming may be overkill for the types of problems asked in interviews.
This category covers a wide range of subtopics related to interviews and jobs. Examples include:
- Since I have ample time to do so, what should I study for Google, Microsoft, Directi, Flipkart, and Amazon interviews a year from now?
- Has your HackerRank profile helped you to get a job?
- What are the standard puzzles asked in programming interviews?
- Why do interviewers care so much about algorithm and data structures?
Languages
Scope: Programming languages in the context of competitive programming. What languages to use, what language features to use, pros and cons of each language, and other language-related topics.
Example questions:
- What are some cool C++ tricks to use in a programming contest?
- What is the best language for Competitive Programming? For example, out of C, C++, Java, and Python, which would be the best language to specialize in for programming competitions?
Math
Scope: Math as it is used in competitive programming.
You can’t do well in programming contests if you only have math skills and haven’t done much programming (there are separate contests for competitive math). However, competitive programming problems do tend to be math-oriented, so having a math background will give you an advantage compared to people who only focus on programming.
Example questions:
- How can I sharpen my mathematical skills in the context of competitive programming?
- Which mathematics topics should I learn to improve my algorithms skills and get started with competitive programming?
Online Judges
Scope: Web sites that present competitive programming problems, accept a solution, and judge whether a solution is correct or incorrect. Some online judges also hold real-time competitions.
This category is closely related to Contests, since some online judges host programming contests. The Online Judges category is for questions about the pros and cons of each online judge, how to use an online judge, and similar questions.
Example questions:
- Which site is better, TopCoder or CodeChef?
- What is the best way to progress through practice problems on CodeChef, SPOJ, TopCoder, etc.?
Organizations
Scope: Competitive programming as it relates to an organization like a company or university.
Many universities train competitive programming teams. Software companies also have an interest in competitive programming, though most questions about companies belong in the Contests or Interviews and Jobs category. If a question is about a company and competitive programming specifically (not a company’s programming contest or online hiring tool), then it belongs here.
Example questions:
- How does Harvard frequently perform extremely well (beating MIT and Stanford) at competitive programming contests even though it’s strong suit is not CS?
- How much importance does Apple give to a competitive programming background during interviews?
People
Quora topic: Competitive Programmers
Scope: The competitive programming advice, opinions, or background of specific people.
One way to approach the canonical How do I get better at competitive programming question is to ask how a specific person achieved success, or what advice they have for others. Those are the most popular question types in the People category. Besides those, this category is also for questions that mention specific people or groups of people.
Example questions:
- What was Anudeep Nekkanti’s Competitive Programming strategy to become 35th in Global ranking, in just 6-7 months?
- How do Russians learn competitive coding?
- What’s your story as a competitive programmer?
Problems
Quora topic: Solving Competitive Programming Problems (there’s also a topic called Competitive Programming Problems, but it currently has 0 questions)
Scope: Questions about competitive programming problems in general, or about what problems can be used to practice a particular algorithm/data structure. If a question describes a specific problem (usually asking how to solve it), it belongs in the Specific Problems category.
Example questions:
- What are some must-do problems on SPOJ?
- What are some good problems that uses Dynamic Programming on Topcoder, Codeforces, Codechef and SPOJ?
Specific Problems
Scope: Specific competitive programming problems. Usually these questions describe or reference a problem, and ask how to solve it. So these questions aren’t very useful unless you’re already working on that problem, or you plan to.
Example questions:
- How do I solve the ACODE problem on SPOJ?
- A man has 81 cows and each is marked with a number from 1 to 81. The number represents amount of milk produced by that cow. How can these cows be divided among nine persons such that all get an equal number of cows producing an equal amount of milk?
Time Management
Scope: Time management techniques for studying competitive programming, and examples of how others have managed their time.
Learning competitive programming, like learning any challenging technical subject, requires more than just assembling the right content. It requires techniques to free up focused time for concentrating on the topic. Questions in this category deal with quantity and quality of study time.
Example questions:
- What is a good estimate for the amount of daily/weekly study Codeforces/TopCoder top 100 users spent to reach this rank?
- How do I divide and manage time between competitive coding, learning new things, and working on personal projects?
- What is a typical day of a competitive programmer preparing for ACM or IOI?
Tools
Scope: Software tools for competitive programmers.
Example questions:
- How do I customize my laptop for TopCoder / Codeforces / Facebook Hacker Cup?
- What IDE for C++ is used by top ranked Codeforces coders?
- What template do you use in competitive programming?
Websites
Scope: Online resources for learning competitive programming.
This category list is about questions on an online Q&A site that cover a computer-related topic. So almost everything listed above will have some relation to websites and online resources. This category is for online resources that don’t fit in another category.
Example questions:
- Is there any Android App available with good programming and algorithm puzzles and problems?
- Which are the top blogs to follow to explore about algorithms and data structures?
- What are some good sources of video tutorials for competitive programming?
(Image credit: Gael Varoquaux)