Рейтинг на Codeforces — нелинейная функция от затраченных часов. На одних полосах прогресс быстрый, на других — застой на месяцы. Главная причина застоя — не «не хватает практики», а пропущенная тема, без которой следующая полоса физически недоступна. Эта статья — карта таких ключевых тем по пяти полосам от 800 до 2000+.
Это не «список тем для подготовки» вообще. Это минимальный набор, без которого следующая полоса остаётся закрытой. Освоить все темы выходящей полосы — необязательно; пропустить одну из перечисленных здесь — почти гарантированно увязнуть.
Полоса 800–1000: разминка и привычки
Что характерно для полосы. Задачи Div.4 / Div.3 A, иногда B. Решаются за 5–15 минут. Алгоритмически — почти ничего: считал, проверил условие, вывел. Главное препятствие на этой полосе — не алгоритм, а техника: умение быстро прочитать условие, разобраться в формате ввода-вывода, не сделать off-by-one.
Ключевые темы:
- Быстрый ввод-вывод. В Python —
sys.stdin.buffer.read().split(); в C++ —ios::sync_with_stdio(false); cin.tie(nullptr);. Без этого задачи с большим объёмом данных вылетают по TL даже при правильном алгоритме. - Базовая работа с массивами и строками. Подсчёт, фильтрация, сортировка. Идиомы языка (list comprehensions в Python, STL в C++).
- Циклы и условия. Простые переборы, аккуратное условие выхода, отсутствие лишних веток.
- Чтение условия. См. отдельный гайд серии — «Как читать алгоритмическое условие: разметка, подводные камни, типичные ловушки». На этой полосе условие — единственный источник ошибок.
Типичные ловушки:
- Off-by-one. Циклы от до или от до — выбрать одну конвенцию, держаться её. Перевод между конвенциями (например, между 1-индексацией в условии и 0-индексацией в коде) — частый источник WA.
- Неправильный тип. В C++
intдля значения до — на грани; для произведений до — переполнение. В Python целые автоматические, но в C++ —long longобязателен на любых подозрительных значениях. - Игнорирование крайних случаев. Пустой массив, , отрицательные числа. Условие может явно не упомянуть — но прийти в тестах.
Признак готовности к следующей полосе: последние 20 задач полосы 800–1000 решаются за минут, ошибки приходят только из невнимательности, а не из непонимания техники.
Полоса 1100–1300: implementation и простые жадные
Что характерно для полосы. Div.3 B, иногда C. Задачи требуют аккуратной реализации — иногда длинной (50–80 строк), но без хитрого алгоритма. Часто — «симулировать процесс по условию», «посчитать количество с условием», «отсортировать и пройти».
Ключевые темы:
- Простые жадные алгоритмы. Отсортировать массив по одному ключу, пройти и собрать ответ. См. «Жадные алгоритмы и exchange argument» — даже простой жадный требует доказательства, иначе WA.
- Префиксные суммы (одномерные). «Сумма на отрезке», «сколько подотрезков с условием». См. соответствующую тему в серии «Алгоритмические основы».
- Два указателя на отсортированном массиве. «Найти пару с суммой », «найти максимальную длину окна со свойством» — базовые задачи на эту технику.
- HashMap / hashset. «Сколько различных», «есть ли дубликат», «частоты». В Python —
dict/Counter; в C++ —unordered_map(с осторожностью к анти-хеш-атакам). - Простые задачи на графы. BFS/DFS на сетке или на маленьком графе. См. разбор «BFS на сетке с препятствиями» и тему «Графы: BFS, DFS и связность».
Типичные ловушки:
- Жадный без доказательства. На этой полосе половина задач ловит на «неправильном жадном». Проверять корректность даже самого тривиального жадного — обязательно.
- Преждевременная оптимизация. Не пытаться писать «компактно» — пишите длинно и читаемо, на этой полосе TL не жмёт.
- Не использовать структуры данных. Иногда на полосе 1300 уже нужны
set/map; их пропуск приводит к там, где должно быть .
Признак готовности: решаете задачи 1100–1300 без подсказок, аккуратно обосновываете жадный, не путаетесь с типами.
Полоса 1400–1600: стандартные техники
Что характерно для полосы. Div.2 B и часть C. Задачи уже не решаются «по интуиции» — требуют конкретной техники, и техника эта обычно одна из 5–7 классических.
Ключевые темы:
- DP — базовые шаблоны. Линейный DP, двумерный DP на сетке. См. тему «DP: базовые шаблоны линейного и двумерного DP». Без DP полоса 1400+ закрыта.
- Бинпоиск по ответу. Самая часто-применяемая техника на полосе 1500–1800. См. тему «Бинпоиск по ответу: когда применять и как выбирать инвариант» и стратегию «Бинпоиск по ответу — траектория 1200 → 1500 → 2000».
- Префиксные суммы 2D. Расширение 1D-префиксов на сетку через включения-исключения. См. соответствующую тему.
- Простые задачи на графы. BFS/DFS более глубоко: компоненты связности, поиск пути, граф из условия (не сразу нарисованный, а закодированный в данных).
- Сортировка с нестандартным компаратором. Сортировка по комбинированному ключу, сортировка пар, обоснование выбора ключа через exchange argument.
Типичные ловушки:
- «Понимаю DP, но не вижу, что задача — DP». Главный навык на этой полосе — распознавать задачи DP по условию (см. сигналы в теме про DP).
- Бинпоиск, где техника не работает. Применение «бинпоиска по ответу» к задачам без монотонного предиката. Лекарство — обязательное доказательство монотонности.
- Сложность при ограничении . Полоса требует понимания асимптотик и умения мысленно прикидывать, помещается ли решение в TL.
Признак готовности: на любой задаче полосы 1400–1600 — за 10 минут чтения условия можете назвать применяемую технику.
Полоса 1700–1900: составные техники
Что характерно для полосы. Div.2 C, начальные Div.2 D. Задачи комбинируют две техники: например, «бинпоиск по ответу + жадная проверка с приоритетной очередью», «DP + префиксные суммы для ускорения перехода», «BFS + DP на расширенном состоянии».
Ключевые темы:
- DP на дереве. DFS-обход с накоплением подответов. См. соответствующий разбор серии — DP на дереве с двумя параметрами состояния.
- Жадные с приоритетной очередью. См. иллюстрацию 2 темы «Жадные алгоритмы и exchange argument» — слияние верёвок через min-heap.
- Сортировка с нетривиальным ключом и доказательством. Полоса 1700+ часто требует доказать ключ; интуиция тут уже не помогает.
- Двухмерный DP с оптимизациями. Rolling array (хранить только 2 строки вместо всех), монотонная очередь для переходов, выпуклая оболочка для linear function aggregation.
- Графы — Дейкстра, 0–1 BFS, топологическая сортировка. Полоса 1800+ часто включает «BFS на взвешенном графе» — нужна Дейкстра или 0–1 BFS.
- Bitmask DP — пограничный случай. На полосе 1900–2200 встречается. См. разбор «DP по подмножествам со счётом перестановок».
Типичные ловушки:
- «Знаю две техники, но не вижу, как их комбинировать». Главный челлендж полосы. Лекарство — практика комбинаторных задач: каждый разбор полосы 1700+ читать с фокусом на «как две техники вместе работают».
- Игнорирование специфики языка. На этой полосе TL начинает жать на Python; некоторые задачи требуют C++. Это не страшно — но нужно понимать.
- Слишком ранний переход. Если на полосе 1500 ещё пропуски — на 1800 будут постоянные WA, не из-за непонимания, а из-за невнимательности в базовых шагах.
Признак готовности: на разборе задачи 1700+ — за 5 минут понимаете, какие две техники применяются и как они склеиваются.
Полоса 2000+: продвинутые техники
Что характерно для полосы. Div.2 D и далее, Div.1 B. Задачи требуют конкретного знания: алгоритмы и структуры данных, не входящие в базовый набор полосы 1900.
Ключевые темы (минимум для полосы 2000–2200):
- Сегментное дерево / Fenwick (BIT). Range queries с обновлениями. Лазурная классификация — от простого «сумма на отрезке + точечное обновление» до lazy propagation с диапазонными обновлениями.
- Bitmask DP уверенно. Полоса 2000+ — родная зона bitmask DP, см. соответствующий разбор.
- DSU (disjoint set union). Объединение компонент, kruskal, offline-обработка запросов.
- Сильно связные компоненты, мосты, point of articulation. Tarjan / Kosaraju.
- Дерево по индексам / persistent структуры. Полоса 2200+.
- Mathematical / number theory tricks. Обратное по модулю, теорема Эйлера, малые-большие теоремы Ферма. Применяется в задачах со счётом по модулю.
Типичные ловушки:
- Попытка применить знакомую технику не там. Bitmask DP — мощно, но не везде; полоса 2000+ требует узнавания, где техника работает, а где нужна другая.
- Игнорирование математических аспектов. Многие задачи 2000+ — это математика, замаскированная под алгоритм. Если не видите формулы — задача может быть не алгоритмическая, а аналитическая.
- Скорость прокачки. Полоса 2000+ — это месяцы и годы. Никакого «прокачаюсь за 2 месяца до 2200» — это нелинейная зона.
Сводная таблица
| Полоса | Ключевые темы | Признак готовности |
|---|---|---|
| 800–1000 | Ввод-вывод, циклы, условия, чтение условия | Решения за мин, нет WA из непонимания |
| 1100–1300 | Простые жадные, prefix sums 1D, two pointers, hashmap, простые BFS/DFS | Жадный с доказательством, использование структур |
| 1400–1600 | DP (1D, 2D), бинпоиск по ответу, prefix sums 2D, базовая теория графов | Распознавание DP, расчёт асимптотик |
| 1700–1900 | DP на дереве, жадные с очередью, Дейкстра, начала bitmask DP | Комбинирование двух техник |
| 2000+ | Сегментное дерево, bitmask DP, DSU, SCC, математика | Узнавание нужной техники |
Как чередовать практику и теорию
- Теория без практики — теряется. Прочитал тему «бинпоиск по ответу» — за следующие 3 дня решил 5–7 задач на эту технику. Иначе через неделю вспомнить шаблон не получится.
- Практика без теории — застревает. Если 20 задач подряд не идут, и каждая — «что-то пробую, не получается» — это сигнал, что пропущена базовая техника. Назад к теории, потом снова к практике.
- Соотношение. Примерно 1:4 — на каждый прочитанный разбор / тему — 4 решённые задачи. Если меньше — теория не закрепляется. Если больше — слишком долго ходите вокруг да около, нужно прочитать ещё.
Как замечать застой
Признаки застоя:
- Несколько контестов подряд — одинаковый рейтинг ±20.
- Решаемые задачи — все примерно одной полосы; на следующую полосу ни одна задача не идёт.
- Чтение разбора задачи следующей полосы — «понятно, но я бы не догадался».
Что делать:
- Найти пропущенную тему. Из таблицы выше — что вы не освоили на текущей полосе? Прочитать тему, решить 5–7 задач.
- Прочитать 5 разборов задач полосы выше. Без решения — просто разборы. Это калибрует «уровень мышления»: какие техники там применяются.
- Найти партнёра / ментора. Один на один с непонятой задачей человек обычно увязает; обсуждение с кем-то ещё, кто понимает технику, разворачивает мышление быстрее.
Итого
- Прогресс — нелинейный. Каждая полоса требует своих техник; пропущенная техника закрывает следующую полосу.
- Минимум на полосу — 4–7 техник. Не «все темы», а критические. Карта выше — этот минимум.
- Практика и теория — 1:4. Меньше — застой, больше — слишком долгое движение.
- Полоса 2000+ — нелинейная зона. Месяцы и годы, не недели.
- Самопроверка — на каждой полосе. Признак готовности к следующей — конкретный: «решаю минут», «вижу технику за 5 минут».
Серия «Алгоритмические основы» покрывает базовые техники для полос 1400–1900; серия «Стратегия победы» — поднимает по одной технике от 1200 до 2000+; разборы конкретных задач — материал для практики. Используйте карту выше как индекс при выборе следующей темы для изучения.