Writing

Competitive Programming:
Beyond the Basics

A practical book for programmers who know the fundamentals and want to develop the judgment, technique, and practice habits required for harder problems.

In active development · August 2026

Most competitive-programming material teaches algorithms one at a time. Contest problems do not arrive that way. They arrive without labels, mix several ideas together, and force you to decide which details matter before you can write a line of code.

This book is about that middle distance: the craft between knowing standard tools and using them fluently under pressure. It is joint work with Josh Alman at Columbia University, shaped by years of competing, coaching, teaching, and writing problems.

We are writing for readers who can implement the basics but still find that unfamiliar problems feel like isolated tricks. The goal is a more connected way to think, practice, and improve.

What the book develops

Recognition

Seeing structure before technique

Learn to reduce a noisy statement to its constraints, invariants, and useful representations before reaching for an algorithm.

Transfer

Connecting ideas across problems

Build reusable mental models so a lesson from one graph, string, or dynamic-programming problem changes how you approach the next.

Execution

Turning insight into correct code

Move from an argument to an implementation with explicit invariants, complexity checks, testing strategy, and fewer avoidable mistakes.

Practice

Designing feedback that compounds

Use post-contest review, targeted problem selection, and deliberate repetition to make practice produce durable improvement.

Provisional contents

The sequence will evolve as we write
  1. Reading constraints as design information
  2. Representations that make structure visible
  3. Invariants, exchange arguments, and proof habits
  4. Dynamic programming as state design
  5. Graph problems beyond named algorithms
  6. Data structures as maintained promises
  7. From idea to implementation
  8. Testing, debugging, and adversarial thinking
  9. Upsolving and post-contest review
  10. Building a practice plan that transfers

A preview of the approach

Working principle

Do not ask only, “Which algorithm is this?”

Ask what information must survive from one decision to the next, what cannot change in an optimal solution, and which representation makes those facts easiest to express. Named algorithms become more useful when they are consequences of the structure you found—not guesses made from surface resemblance.