15-295: Competition Programming and Problem Solving, Fall 2018

In this course you will learn the techniques and skills needed to solve algorithmic programming contests problems such as those that appear on the ACM ICPC, Codeforces, and Topcoder. Most of your time will be spent writing programs on your own to solve problems.

Some students may go on to participate in the ACM ECNA regional event (which occurs in the fall -- see the section at the end of this page to learn how to be on a team) and possibly even the World Finals (which occurs in the spring).

But the skills you will pick up from the course are far more valuable than just enabling you to win contests. Many of the algorithms and techniques are classic ones that every computer scientist should know. You will also learn to think about algorithms in a deeper way, because many of the problems require you have to devise a new algorithm, not just apply a classic one. These skills will be of great value in your other classes, in your job interviews, and in your future work.

Basic Information

Class Meetings: Wednesdays from 6:30-9:20pm, Wean Hall 5421
Instructor: Danny Sleator <sleator@cs.cmu.edu>, Office: Gates 8113, Phone: 412-268-7563
Google 15-295 Group: http://groups.google.com/group/15-295 (Required)
Codeforces 15-295 Group: http://codeforces.com/group/KIrM1Owd8u/contests (Required)
Name List: Put your names here (Required)
Grade Spreadsheet: Tabulation of Scores

For more information on how to join these groups, etc, see the Logistics section below.

Weekly Problem Sets

Most problem sets will have a theme announced in advance, along with links so you can learn about the material before class if you want. There may be an occasional "mini-lecture" in the classroom from 6 to 6:30, before the contest starts. The mini-lecture will cover the theme topic for the contest, and be announced via email in advance.

The weekly contests will take place on Codeforces. They are classified under a "Codeforces Group" called 15-295. Click on this link to see a list of contests for this course and to participate in it.

The point values of the problems for each weekly contest are tabulated below, along with a solutions page which is based on contributions from students and staff in the class.

Finished Contests:

#01 Aug 29, 2018: Point values: 1,1,2,2,3,3  Problems  Contest Link  Solutions
#02 Sept 05, 2018: Point values: .5,1,2,2,2,2  Problems  Contest Link  Solutions
#03 Sept 12, 2018: Point values: .5,1,1,2,2,3  Problems  Contest Link  Solutions
#04 Sept 19, 2018: Point values: 3,3,1,2,1,2  Problems  Contest Link  Solutions
#05 Sept 26, 2018: Point values: 2,3,3,1,1,1  Problems  Contest Link  Solutions
#06 Oct 03, 2018: Point values: 1,1,2,2,3,3  Problems  Contest Link  Solutions
#07 Oct 10, 2018: Point values: 2,2,3,3,3,3  Problems  Contest Link  Solutions
#08 Oct 17, 2018: Point values: 1,1,2,2,3  Problems  Contest Link  Solutions
#09 Oct 24, 2018: Point values: 1,2,2,2,3,3  Problems  Contest Link  Solutions
#10 Oct 31, 2018: Point values: 1,2,2,2,3,3  Problems  Contest Link  Solutions
#11 Nov 07, 2018: Point values: 1,1,2,2,1,3  Problems  Contest Link 
#12 Nov 14, 2018: Point values: 1,1,2,2,2,2  Problems  Contest Link  Solutions
#13 Nov 28. All problems 1 point. Scoreboard
#14 Dec 05, 2018: Point values: 2,3,3,3,3  Problems  Contest Link  Solutions

Finished Topics

#02 Dynamic Programming:
451 lecture notes, DP problem set from 15-295 Spring 2018, Contest Link, Solutions to this contest

#03 Shortest Paths: Dijkstra Bellman-Ford and Floyd-Warshall

#06 Using Bit Operations (except problem F)

#07 Network Flow: Basics, Dinic's Algorithm, Min-cost flows

#08 Depth First Search and Strong Components: 451 Lecture Notes

#10 Disjoint Set Data Structures (Union-Find) Read through page 3 of these notes

#11 Sleator 251 lectures: Impartial Games Sums of Games,

#12 Geometry. Geometric primitives and convex Hull, Sweep-line and Sweep-angle, Voronoi Diagrams and Delaunay Triangulations

#14 Nov 28, 2018: SegTrees, Range Trees, Fenwick Trees Read section 2 and section 4 of these notes., A segment tree implementation and tutorial, Range Trees (AKA Fenwick Trees) (Nothing here covers the realm of augmentations of these trees, which is often the hardest and most interesting part.)

Potential future topics:

Shortest Paths
Binary Search
Trees -- properties and how to exploit them
Impartial Games
Flow (Max Flow, Min Cost Flow, Matchings)
Data structures (Disjoint Sets, SegTrees, FenwickTrees, Link-Cut trees)
String Algorithms (KMP, Z-algorithm, Karp-Rabin, Suffix Arrays)
Number Theory (GCD, Factoring, Primality Testing, Arithmetic mod p)
Geometric Algorithms (Geometric primitives, Sweep Line, Canonical Form)
FFT (over Complex Numbers, over Finite Fields)
Linear Algebra (Linear Programming, Gaussian Elimination)
Greedy Algorithms


This course is 5 units. Each week you will be given several problems to try to solve during class. You will be allowed (for half credit) to solve these problems during the week after the contest ends. You can also get credit for solving problems during rated contests on Codeforces. (This site run rated contests approximately every two weeks.)

Let me be more specific. Each problem that we give has some number of points between 0.5 and 3. Let X be the total number of points of the problems you solve in class. Let X' be the total number points of the problems you solve in the week after class. Let Y be the number of Codeforces problems you solve. (Y only counts problems B, C, etc. (NOT A, they're too easy) solved during rated contests. Virtual contests are not rated.) Your score in the course is X + X'/2 + Y.

Here is how your grade is determined:

score ≥ 25: A
score ≥ 15: B
score ≥ 10: C
score ≥   5: D


You can make use of generic on-line resources while solving problems. These include things like language documentation, API documentation, algorithm descriptions, terminology, etc. You should not search for or make use of code written by others to solve the specific assigned problem.

If you're stuck on a problem, you are welcome to discuss it with another student in the class, or the course staff. Keep the level down so as not to disturb those around you.

During the selection rounds (see below), discussion with classmates is not allowed. Clarifications can be obtained from the course staff.



In case you're unfamiliar with how to deal with standard input and standard output, here is a link to a document showing the solution to a problem in several different languages.

The Competitive Programmer's Handbook by Antti Laaksonen covers (perhaps somewhat superficially) many topics that come up in competitive programming.

Last semester's course has links to the topics for each of those contests, as well as solutions to many of the problems.

A way to get started and to improve is via the USACO training site. They've developed a series of lessons along with corresponding problems. It will take you from a beginner to a strong contest programmer.

There are a number of excellent tutorials on the algorithms and techniques needed to solve these kinds of contest programs on Topcoder's Data Science Tutorials web site.

You can also do old problems on codeforces. Just go to codeforces.com/contests and click "enter" on any of the contests. You can then try solving problems. You can also go to the scoreboard of the contest and click on other people's solutions to see their code. This is a great way to learn.

Feel free to contact (email or stop by) the instructor or the TA any time to discuss problems, including during class.

Here are a few tutorials about important algorithms:

A segment tree implementation and tutorial.
Range Trees (AKA Fenwick Trees)
Lecture Notes about min cost flow, along with an implementaiton.
Union-Find Lecture Notes.
Link-Cut Trees (See detailed comments in this codeforces submission.)
Long Blog Post on Graph Algorithms

TODO: Add to this list

Being on an ACM ICPC Team

We typically send five teams of three to the ACM ECNA regional event. This year it will take place on Saturday November 10. We drive to Youngstown on Friday afternoon, stay in a hotel, do the contest on Saturday, and return in the early evening on Saturday night.

The teams will be selected based on the results of two contests which will take place during regular class times on September 19th and 26th. I am only considering undergraduate students or masters students who are eligible to go to the World Finals (you can't go to the world finals more than two times). The World Finals will take place in the spring of 2019 in Porto Portugal. If you are interested in trying to be on a team, it is imperitive that you participate and do well in the two selection rounds on Sept. 19th and 26th.

Danny Sleator
Last modified: Wed Jan 16 20:19:13 2019