2017.A-AA
Темы прочитанных лекций в 2017.Август.АА/A-ML
- Персистентные структуры данных
- Быстрое преобразование Фурье
- Максимальный поток и минимальный разрез
- Потоки минимальной стоимости
- Матроиды, базовые понятия и теоремы
- Пересечение и объединение матроидов
- Геометрия, базовые примитивы и применения
- Геометрия, продвинутые алгоритмы
- LCA, LA
- HLD, Centroid decomposition
- Суффиксный автомат
- Морской бой A1 vs. A2
- Приближенные алгоритмы и оптимизации ДП
День 01, лекция
Персистентные структуры данных
- Что такое персистентность (частичная, полная, ...)
- Примеры персистентных структур данных
- Линейные структуры данных: персистентный стек, персистентный массив
- Персистентное дерево отрезков
- Персистентное декартово дерево
- Примеры задач на персистентные СД
- К-я порядковая статистика на отрезке
- Копирование отрезка из одной части массив в другую
- (*) Частичная персистентность за O(1), скетч
День 02, лекция
Быстрое преобразование Фурье и всякие мелочи.
- Умножение больших чисел, умножение многочленов, мотивация и сведение первого ко второму.
- Введение в комплексные числа
- Определение, умножение и сложение
- Тригонометрическая форма
- Умножение, возведение в степень в тригонометрической форме
- Извлечение корня
- Структура множества корней, умножение корней из 1 между собой, связь с корнями меньшего порядка
- Многочлены
- Теорема Безу, единственность многочлена по парам (x,f(x)), конструктивное построение
- Умножение многочленов как умножение значений в точках, определение ДПФ
- Быстрое преобразование фурье для 2^n, сведение к меньшим задачам.
- Обратное преобразование Фурье, сведение к прямому
- Эффективная реализация FFT
- FFT над целыми числами.
- Определение группы, примеры
- Группа (Z/pZ)*
- Циклическая группа, первообразный корень в (Z/pZ)*, без доказательства цикличности
- ФФТ-Модуль (998244353 = 1 + 2^23 7 17) подгруппы, завершение рассказа о целых числах
- Полезные задачи
- Скалярное произведение строки на большую строку.
День 03, лекция
Максимальный поток и минимальный разрез.
- Базовые определения
- Сети, пропускные способности
- Поток, свойства потока, величина потока
- Остаточная сеть
- Разрез, стоимость разреза, поток через разрез
- Теорема Форда-Фалкерсона о равенстве максимального потока и минимального разреза
- Лемма про отношение величины любого потока и любого разреза
- Конструктивное построение потока, равного разрезу
- Алгоритм Форда-Фалкерсона нахождения максимального потока
- Декомпозиция потока
- Алгоритм Эдмондса-Карпа
- Схема алгоритмов с масштабированием
- Алгоритм Диница
День 04, лекция
Потоки со стоимостью и венгерский алгоритм.
- Базовые определения
- Связь минимальности потока и отсутствия циклов отрицательной стоимости в остаточной сети
- Оптимизированный алгоритм Форда-Беллмана
- Потенциалы Джонсона
- Поиск потока минимальной стоимости с использованием алгоритма Дейкстры
- Венгерский алгоритм
День 05, лекция
Матроиды, часть 1
- Определения: независимые множества, аксиомы матроидов, база, цикл
- Примеры матроидов
- Прямая сумма матроидов
- Теорема о базах
- Теорема о циклах
День 06, лекция
Матроиды, часть 2
- Пересечение матроидов
- Граф замен
- Теорема о корректности
- Алгоритм построения базы
- Примеры
- Объединение матроидов
- Доказательство, что объединение -- матроид
- Сведение к пересечению матроидов
День 07, лекция
Геометрия, часть 1
- Базовые примитивы, скалярное/векторные произведения
- Предикат "точка внутри окружности, описанной вокруг треугольника"
- Сортировка по углу
- Алгоритмы построения выпуклой оболочки
- Вращающиеся калиперы
- Диаметр множества
- Минимальный объемлющий прямоугольник
- Двоичный поиск по выпуклому многоугольнику
- Ближайшая точка к выпуклому многоугольнику
- Касательные к многоугольнику
День 08, лекция
Геометрия, часть 2
- Сумма Минковского
- Пересечение полуплоскостей, предикат проверки трех прямых на выпуклость
- Ушная триангуляция
- Минимальная объемлющая окружность, рандомизированный алгоритм
- 3D геометрия, примитивы
- Два алгоритма построения выпуклой оболочки за O(N^2)
День 09, лекция
LCA & LA
- LCA
- Постановка задачи, предикат is_parent, решение за O(n)
- Двоичные подъёмы
- Алгоритм Тарьяна
- Решение за < n*log(n), 1 >
- Алгоритм Фарака-Колтона и Бендера
- RMQ -> LCA (дек. дерево)
- LCA -> RMQ+-1
- RMQ +- 1 за < n, 1 > методом четырех русских
- LA
- Постановка задачи, решение через двоичные подъёмы.
- Алгоритм Вишкина (< n, log > через спуск)
- Лестницы (удлинённые long-path-decomposition)
- Применение метода четырех русских для сжатия деревьев размера <= log(n)/4
День 10, лекция
Centroid decomposition
- Определение центроида дерева, существование и нахождение
- Определение центроидной декомпозиции, построение
- Свойства дерева центроидной декомпозиции
- Глубина O(\log n) (=> O(n \log n) на построение)
- Единственность центроида на пути (как LCA в дереве ц.д.)
- Алгоритмы нахождения LCA (O(\log n) линейный поиск, O(\log log n) дв подъёмы, O(1) спарсы)
- Доказательство количества центроидов (1-2)
Задачки на центроиды
- min на пути (O(LCA))
- Разделяй и властвуй как centroid decomp от бамбука
- максимальный путь в дереве по весу (веса на рёбрах), O(n log n).
- Динамика f(i) = max path: l(path) = i
- максимальный ограниченный путь в дереве (то же самое но ищем путь длины <= l), O(n \log n)
- Динамика f(i) = max path: l(path) <= i
- Приливаем small-to-large чтобы не было проблем с пересчётом
- "Покраска близких" (узнать цвет вершины, покрасить все вершины len(u, v) <= l в цвет c)
- Offline, всё чтение строго после присвоений O((m + n) log n)
- Запросы в произвольном порядке O(log^2 n) на запрос
- Запросы в произвольном порядке O(log n) на запись, O(log^2 n) на чтение
Heavy-light decomposition
- Определение декомпозиции Heavy-Light
- функция на пути => 2 функции на вертикальном пути => кусочки каких-то путей HLD
- Про поддеревья и пути (ALL in one SegmTree)
Задачки на HLD
- Разбить дерево на вертикальные пути, так чтобы максимальное число
путей, которые войдут в декомпозицию, от листа до корня было бы
минимально
- Динамическое добавление новых вершин в предыдущей задаче
- f(v) = \sum_{i=0}^{v-1} w_{lca(v,i)}, вычислить все f(v) за быстро.
День 11, лекция
Суффиксный автомат
- Конечные автоматы, определение, примеры.
- Суффиксный автомат, определение, пример.
- Правые контексты, свойства
- вложены или не пересекаются
- пересечение правых контекстов у строк - тогда одна суффикс другой
- Дерево правых контекстов, оценка на число вершин
- Модификация правых контекстов, при добавлении новой буквы к слову.
- расщепление вершины, лемма о самом длинном суффиксе, который встречался ранее
- Алгоритм построения
- Схема доказательства линейности времени работы
День 13, лекция
Приближенные алгоритмы
- Мотивация
- Бывает NP, но хочется что-то посчитать быстро, даже если не совсем точно.
- В частности будем искать решения не хуже, чем в f(n) раз.
- MAX3SAT
- VertexCover
- Жадный Алгоритм (for ребро, если нет в текущем множестве, то возьмём 2 конца).
- Доказательство, что он хуже не более чем в 2 раза.
- TSP, 2-OPT
- Постановка, неравенство треугольника, его существенность (сведение HAMCYCLE)
- Решение через MST (обошли, скосили)
- TSP, 1.5-OPT (Cristofildes).
- Парсоч на нечётных вершинах в дереве (MST + парсоч).
- C(парсоч) <= 1/2 C(OPT)
- Веса 1-2 с неравенством треугольника, это NP-hard
- если C <= 321/320 - \eps для \forall \eps
- MaxClique
- Получить решение не хуже, чем O(n^{0.99}) от оптимального это NP.
- Что-то сделать можно: Разделить N вершин на групп размера k, прочекать каждую (nk2^k), k = c log(n) => P.
- Оптимальность: пусть ans, тогда есть группа, где ans/(n/k) => мы нашли ans' >= ans (k/n).
- SetCover
- Постановка задачи
- Жадный алгоритм
- Доказательство двоичного логарифма
- На самом деле натуральный (без доказательства)
- Пример, когда лог
Оптимизации ДП
- Кнут
- c(i, i) = 0
- c(i, j) = w(i, j) + min_{i < k <= j} (c(i, k - 1) + c(k, j))
- w(i, j) удовлетворяет монотонности & QI
- Кнут-2
- d[k][i] = min_{0 <= t < i} d[k - 1][t] + c(t + 1, i), задача про почтовые отделения.
- CHT
- D&C
- \lambda