Competition Programming and Problem Solving

15-195 and 15-295 Spring 2024

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

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. You will also become highly fluent in a programming language of your choice. These skills will be of great value in your other classes, in your job interviews, and in your future work, not to mention the satisfaction you will get from solving these problems.

Basic Information
Weekly Problems
Rules and Academic Integrity
Grading
Logistics
Training Resources
Learning Material
Diversity, Equity and Inclusion

Basic Information

The regular weekly contests will take place Wednesdays beginning at 7pm in Gates Hillman Center 4307, and last 2.5 hours (you don't have to stay the whole time.) Occasional lectures may take place at 6pm in the same room. They will be announced on Discord. Lectures will cover introductory content aimed at beginners to competitive programming. Although attendance to the lectures is optional, it is strongly encouraged for beginners. During the contests, the instructors will be available for help in the classroom, or via Discord.

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

Weekly Contests

Week #9: (March 20) BucketPotato's Contest!

Contest Link: Here
Solutions: In PDF

Week #8: (March 13) Tree DPs

Contest Link: Here
Solutions: For Viewing

Week #7: (February 28) Counting Things

Contest Link: Here
Solutions: For Viewing

Week #6: (February 21) Graphs

Contest Link: Here
Solutions: For Viewing

Week #5: (February 14) No Theme

Contest Link: Here
Solutions: For Viewing

Week #4: (February 7) No Theme

Contest Link: Here
Solutions: For Viewing

Week #3: (January 31) Binary Search

This week, we will solve problems that use the binary search technique. You might think of binary search as an algorithm for finding an element in a sorted list, but it is actually a much more general technique than that, and can be used to solve a wide range of problems. Essentially, binary search allows you to solve problems where you must minimize or maximize some quantity subject to some contraint, as long as that constraint is monotone. A constraint is monotone if it is false for all values of x up to some value, and then becomes true after that value. Binary search allows us to efficiently find this partition point, and hence solve the corresponding optimization problem. The practice problems this week should help you to learn to apply this powerfull technique.

Lecture Slide: Here   binary search code   ternary search code
Contest Link: Here
Solutions: For Viewing

Week #2: (January 24): Built-in Data Structures

Today we do more CSES and USACO problems. Several of these make use of data structures built-in to C++. (Specifically problem B makes use of sets and multisets, and problem F makes use of maps.)

Lecture Slide: Here
Contest Link: Here
Solutions: For editing For viewing

Week #1 (January 17): Introduction

This week has no particular algorithmic theme. Instead, we will go over the basics of competitive programming and do our first contest on vjudge.net. Please make sure you have a Vjudge account ready to go and understand how to upload your solutions to the problems.

If you don't know how to read from standard input and write to standard output, here's a tutorial showing how to do it.

Contest Link: Here
Solutions: For editing For viewing

Rules and Academic Integrity

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 are allowed to use any code you have written, at any time in the past, for any purpose. However, you should not search for or make use of code written by others to solve the specific assigned problem. You're allowed to copy somewhat standard pieces of code (e.g. a primality test) that you find on-line or in a book.

So to summarize, each student should write his or her own code. If you're stuck on a problem, you are welcome to discuss it with another student in the class, or the course staff. But you cannot copy another student's code.

The violations described above are regarded as an academic integrity violation, and -- depending on the severity -- will result in penalties and/or be reported to the appropriate university authorities.

Grading

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.)

To be more specific, you can earn points from the following sources:

The differences between 15-195 and 15-295 are: Students enrolled in 15-295 will not get credit for problems A and B of the weekly contests, but 15-195 students can. A student can take 15-195 only once, but 15-295 can be taken repeatedly.

Here is how your grade is determined:

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

Logistics

Training Resources

First of all if you need help reading from standard input, or writing to standard output, see this link.

There are many online resources available for you to train with if you intend to become a serious competitive programmer. You can find thousands of practice problems for you practice and improve your skills. Some good places to find practice problems include:

Learning Material

If you are a beginner looking for resources to learn the various topics that appear in typical contests, some good sources are:

Diversity, Equity, and Inclusion

We must treat every individual with respect. We are diverse in many ways, and this diversity is fundamental to building and maintaining an equitable and inclusive campus community. Diversity can refer to multiple ways that we identify ourselves, including but not limited to race, color, national origin, language, sex, disability, age, sexual orientation, gender identity, religion, creed, ancestry, belief, veteran status, or genetic information. Each of these diverse identities, along with many others not mentioned here, shape the perspectives our students, faculty, and staff bring to our campus. We, at CMU, will work to promote diversity, equity and inclusion not only because diversity fuels excellence and innovation, but because we want to pursue justice. We acknowledge our imperfections while we also fully commit to the work, inside and outside of our classrooms, of building and sustaining a campus community that increasingly embraces these core values.

Each of us is responsible for creating a safer, more inclusive environment.

Unfortunately, incidents of bias or discrimination do occur, whether intentional or unintentional. They contribute to creating an unwelcoming environment for individuals and groups at the university. Therefore, the university encourages anyone who experiences or observes unfair or hostile treatment on the basis of identity to speak out for justice and support, within the moment of the incident or after the incident has passed. Anyone can share these experiences using the following resources:

All reports will be documented and deliberated to determine if there should be any following actions. Regardless of incident type, the university will use all shared experiences to transform our campus climate to be more equitable and just.


Danny Sleator
Last modified: Wed Mar 20 23:13:17 2024