Олимпиадная информатика
Премиальный курс по олимпиадной информатике для школьников, готовящихся к ВсОШ, олимпиадам и Codeforces. От оценки сложности и базовых приёмов (перебор, бинарный поиск, два указателя, префиксные суммы, жадность) через структуры данных (стек, очередь, DSU, дерево отрезков, куча) и графы (BFS/DFS, Дейкстра, топсортировка, MST) к динамическому программированию, теории чисел и строковым алгоритмам. Каждый приём разобран с интуицией, корректной запускаемой реализацией на Python, честным анализом сложности и подводными камнями.
Курс «Олимпиадная информатика» состоит из 7 разделов и 32 уроков: Введение в олимпиадное программирование, Базовые приёмы решения задач, Структуры данных, Графы, Динамическое программирование, Математика и строки и Стратегия и практика. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Введение в олимпиадное программирование
- Как устроены олимпиады и онлайн-судьи
Что такое олимпиадное программирование, как читать вердикты онлайн-судьи (OK, WA, TLE, MLE, RE) и как устроены тесты.
- Быстрый ввод и вывод в Python
Почему input() и print() медленны на больших данных и как читать через sys.stdin, выводить одним блоком и обходить рекурсию и лимиты Python.
- Асимптотика: O-нотация и оценка «уложусь ли по времени»
Что такое O-большое, как оценивать число операций по размеру входа и как по ограничениям n заранее выбрать допустимую сложность алгоритма.
- Как устроены олимпиады и онлайн-судьи
2 Базовые приёмы решения задач
- Полный перебор и его границы
Когда полный перебор (brute force) — правильное решение, как перебирать подмножества и перестановки и где проходит граница применимости по n.
- Бинарный поиск: по массиву и по ответу
Классический бинарный поиск в отсортированном массиве, lower_bound/bisect и мощнейший приём «бинпоиск по ответу» для задач на минимизацию и максимизацию.
- Два указателя и скользящее окно
Техника двух указателей и скользящего окна: как за один проход O(n) решать задачи на пары, подотрезки и подстроки вместо квадратного перебора.
- Префиксные суммы и разности
Префиксные суммы для ответа на запрос суммы отрезка за O(1) и массив разностей для быстрых диапазонных прибавлений. Базовый приём предобработки.
- Сортировка и жадные алгоритмы
Жадные алгоритмы: как сортировка по правильному ключу даёт оптимум, на примере выбора заявок, и как доказывать корректность жадности (приём обмена).
- Полный перебор и его границы
3 Структуры данных
- Стек, очередь и дек
Три базовые линейные структуры: стек (LIFO), очередь (FIFO) и дек. Реализация в Python, задача о правильных скобках и приём «ближайший больший элемент».
- Словари и множества: хеши на службе скорости
Хеш-таблицы в Python (dict, set, Counter): доступ за O(1) в среднем, подсчёт частот, проверка наличия, приём «два числа с заданной суммой» за линию.
- Система непересекающихся множеств (DSU)
Структура DSU (Union-Find): объединение множеств и проверка связности почти за O(1) благодаря сжатию путей и объединению по рангу. Применения в графах.
- Дерево отрезков: запросы и обновления за O(log n)
Дерево отрезков (segment tree) для суммы/минимума на отрезке с точечным обновлением. Идея, итеративная реализация на массиве и анализ сложности.
- Куча (heapq): приоритетная очередь
Двоичная куча и модуль heapq: извлечение минимума за O(log n). Применения — k наименьших, слияние списков, основа алгоритма Дейкстры.
- Стек, очередь и дек
4 Графы
- Представление графа
Что такое граф и как его хранить: список смежности и матрица смежности. Когда какое представление выбрать и как читать граф из ввода.
- Обходы графа: BFS и DFS
Два фундаментальных обхода: в ширину (BFS) даёт кратчайшие пути в невзвешенном графе, в глубину (DFS) — рекурсия и стек. Реализации и применения.
- Компоненты связности
Как разбить граф на компоненты связности обходом, посчитать их число и пометить вершины. Применение на сетках (заливка) и в задачах на «острова».
- Кратчайшие пути: Дейкстра и 0-1 BFS
Алгоритм Дейкстры на куче для кратчайших путей во взвешенном графе и приём 0-1 BFS на деке для рёбер с весами 0 и 1. Когда какой применять.
- Топологическая сортировка
Топологический порядок вершин ориентированного ациклического графа (DAG): алгоритм Кана на входящих степенях. Применение к зависимостям и обнаружению циклов.
- Минимальный остов: алгоритм Краскала на DSU
Минимальное остовное дерево (MST): зачем нужно и как его строит алгоритм Краскала — сортировка рёбер плюс DSU. Корректность и сложность.
- Представление графа
5 Динамическое программирование
- Идея динамического программирования и одномерные ДП
Что такое динамическое программирование: подзадачи, переход и мемоизация. Одномерные ДП на примерах чисел Фибоначчи, лесенки и способов размена.
- Рюкзак (knapsack)
Задача о рюкзаке 0/1: динамика по вместимости. Наивная двумерная таблица и оптимизация до одномерного массива с обратным проходом. Анализ сложности.
- ДП на подпоследовательностях: LIS и LCS
Наибольшая возрастающая подпоследовательность (LIS) за O(n log n) и наибольшая общая подпоследовательность (LCS) двух строк. Два классических ДП.
- ДП на подотрезках (интервальное ДП)
Интервальное ДП: состояние — отрезок [i, j], переход — выбор точки разбиения. Классика на примере оптимального умножения цепочки матриц.
- Восстановление ответа в ДП
Как по таблице ДП вывести не только значение оптимума, но и сам ответ: хранение выбора (parent/choice) и обратный проход. Примеры на размене и рюкзаке.
- Идея динамического программирования и одномерные ДП
6 Математика и строки
- НОД, НОК и быстрое возведение в степень
Алгоритм Евклида для НОД и формула НОК через НОД. Бинарное возведение в степень за O(log n) — основа модулярной арифметики и многих формул.
- Решето Эратосфена и факторизация
Решето Эратосфена находит все простые до N за O(N log log N). Разложение числа на простые множители за O(sqrt(N)). Базовые приёмы теории чисел.
- Модулярная арифметика
Зачем ответы берут по модулю 10^9+7, как корректно складывать/умножать/вычитать по модулю и как делить через обратный элемент по малой теореме Ферма.
- Комбинаторика для олимпиад
Перестановки, размещения и сочетания; биномиальные коэффициенты C(n,k). Предподсчёт факториалов и обратных для вычисления C(n,k) по модулю за O(1).
- Строки: хеши и алгоритм КМП
Полиномиальный хеш строки для сравнения подстрок за O(1) и префикс-функция (алгоритм Кнута-Морриса-Пратта) для поиска образца за O(n+m).
- НОД, НОК и быстрое возведение в степень
7 Стратегия и практика
- Как читать условие и выбирать алгоритм
Алгоритм работы над задачей: разбор условия, чтение ограничений, оценка нужной сложности и выбор подходящего приёма. Чек-лист и типичные паттерны.
- Отладка и стресс-тестирование
Как ловить баги без скрытых тестов: стресс-тестирование сравнивает быстрое решение с медленным эталоном на случайных данных и находит контрпример.
- Разбор задач от идеи до кода и куда двигаться дальше
Три полных разбора олимпиадных задач: от чтения условия через выбор приёма к рабочему коду. Сводная карта приёмов курса и план дальнейшего роста.
- Как читать условие и выбирать алгоритм