Перейти до основного вмісту

Найпопулярніші алгоритми

Добірка алгоритмів, які покривають левову частку задач на контестах. Якщо не знаєш, з чого почати розв'язок — переглянь колонку «Коли застосовувати»: часто сама умова задачі підказує інструмент.

Основи

АлгоритмСкладністьКоли застосовувати
Бінарний пошукO(logn)O(\log n)Відсортований масив або монотонний предикат («якщо відповідь xx підходить, то і все більше за xx підходить») — половина задач типу «знайди мінімальне/максимальне xx»
Бінарне піднесення до степеняO(logn)O(\log n)Великі степені за модулем (anmodma^n \bmod m), швидке множення матриць, nn-те число Фібоначчі
Алгоритм ЕвклідаO(logn)O(\log n)НСД/НСК двох чисел; розширена версія — діофантові рівняння й обернений елемент за модулем
Решето ЕратосфенаO(nloglogn)O(n \log \log n)Усі прості числа до nn, найменші прості дільники, передобчислення для факторизації
Тернарний пошукO(logn)O(\log n)Максимум/мінімум унімодальної функції (спершу зростає, потім спадає)

Структури даних

АлгоритмСкладністьКоли застосовувати
Дерево відрізківO(logn)O(\log n) на запитСуми/мінімуми/максимуми на відрізку з оновленнями елементів; найуніверсальніша структура — якщо сумніваєшся, бери її
Дерево ФенвікаO(logn)O(\log n) на запитПрефіксні суми з оновленнями — простіше й швидше за дерево відрізків, коли операція оборотна (сума, XOR)
СНМ~O(1)O(1) на запитДинамічна зв'язність: «чи в одній компоненті aa та bb?» після серії об'єднань; основа алгоритму Крускала
Розріджена таблицяO(1)O(1) на запитМінімум/максимум/НСД на відрізку без оновлень — передобчислив раз, відповідаєш миттєво

Графи

АлгоритмСкладністьКоли застосовувати
BFSO(V+E)O(V+E)Найкоротші шляхи в незваженому графі; «мінімальна кількість кроків» у сітках і головоломках
DFSO(V+E)O(V+E)Компоненти зв'язності, пошук циклів, топологічне сортування, часи входу/виходу
ДейкстраO(ElogV)O(E \log V)Найкоротші шляхи з однієї вершини, ваги невід'ємні (версія з купою для розріджених графів)
Беллман-ФордO(VE)O(VE)Найкоротші шляхи з від'ємними вагами; детекція від'ємних циклів
Флойд-ВоршеллO(V3)O(V^3)Найкоротші шляхи між усіма парами, коли V500V \lesssim 500 — три вкладені цикли і готово
Топологічне сортуванняO(V+E)O(V+E)Порядок виконання із залежностями (DAG): збірка проєкту, переліки курсів, ДП на графі
Крускал / ПримO(ElogV)O(E \log V)Мінімальне кістякове дерево: з'єднати все мінімальною сумарною вартістю
LCA через binary liftingO(logn)O(\log n) на запитНайнижчий спільний предок у дереві; відстані між вершинами дерева, підйом на kk предків
Потік ДініцаO(V2E)O(V^2 E)Максимальний потік / мінімальний розріз; задачі про пропускні здатності й розбиття на дві множини
Алгоритм КунаO(VE)O(VE)Максимальне парування у дводольному графі: «розподіли працівників по задачах»

Динамічне програмування

АлгоритмСкладністьКоли застосовувати
РюкзакO(nW)O(nW)Вибір підмножини предметів з обмеженням на сумарну вагу/вартість — і десятки замаскованих варіацій
НЗПO(nlogn)O(n \log n)Найдовша зростаюча підпослідовність; задачі про «вкладені» об'єкти, мінімум ланцюгів покриття
ДП за профілемO(n2m)O(n \cdot 2^m)Замощення/розфарбування вузької сітки (m20m \lesssim 20): стан — бітова маска стовпця

Рядки

АлгоритмСкладністьКоли застосовувати
Префікс-функція (КМП)O(n)O(n)Пошук підрядка в рядку, періоди й бордери рядка, підрахунок входжень
Z-функціяO(n)O(n)Ті самі задачі, що й КМП, але часто простіша в міркуваннях: z[i]z[i] — довжина збігу з префіксом
Хешування рядківO(1)O(1) порівнянняПорівняння будь-яких підрядків за O(1)O(1) після передобчислення; кількість різних підрядків; коли суфіксні структури — overkill
Ахо-КорасікO(сумарної довжини)O(\text{сумарної довжини})Пошук багатьох патернів у тексті одночасно (словник у боро + суфіксні посилання)
Суфіксний масивO(nlogn)O(n \log n)Лексикографічні задачі на суфіксах: kk-тий підрядок, найдовший спільний підрядок, кількість різних підрядків

Геометрія та інше

АлгоритмСкладністьКоли застосовувати
Опукла оболонкаO(nlogn)O(n \log n)Мінімальний опуклий многокутник навколо точок; перший крок багатьох геометричних задач
Замітаюча прямаO(nlogn)O(n \log n)«Чи перетинається хоч одна пара відрізків» та інші задачі, де події обробляються зліва направо
Бінарне сортування пар / СНМ-офлайнO(nα)O(n \cdot \alpha)Офлайн-відповіді на запити LCA, коли всі запити відомі заздалегідь
Числа КаталанаO(n)O(n)Підрахунок: правильні дужкові послідовності, бінарні дерева, тріангуляції — якщо відповідь 1, 2, 5, 14, 42 — це вони
Біноміальні коефіцієнти за модулемO(1)O(1) після O(n)O(n)Будь-який комбінаторний підрахунок за модулем — передобчисли факторіали й обернені

Не знайшов потрібного? Повний каталог зі ~160 статей — у бічній панелі, а маршрут для новачків — на головній.