Четвертая лекция
- Динамика
- Как удобно писать динамику по дереву (см. задачу из контеста)
- Состояние вместо [v,i] кодируем, как [x], где x = next[v,i]
- Восстановление ответа
- Время работы динамики по дереву
- На практике любое дерево можно сделать бинарным (рисуем биекцию)
- На практике бывает только два крайних случая: полное бинарное дерево, линия
- Задача: для каждого i=1..n посчитать количество способов вырезать поддерево размера i
- T(n) = T(x) + T(n - x - 1) + x * (n-x-1) → O(n2)
- Задача: для каждого i=1..k посчитать количество способов вырезать поддерево размера i
- T(n) = T(x) + T(n - x - 1) + min(k, x) * min(k, n-x-1) → O(nk)
- Задачка от Кнута за O(n2): даны n точек на прямой, выбрать k точек-центров так, чтобы сумма расстояний до ближайшего цетра была минимальна
- Задачка про командный пункт O(n2logn): на окружности n точек, выбрать k так, чтобы площадь многоугольника была максимальна.
- Решение за O(n3k) --- перебираем, где разрезали, динамика по состоянию [n,k], переход за линию
- Улучшаем решение до O(n3) --- перебираем только O(n/k) разрезов
- Другое улучшение того же решения: при переходе как-нибудь воспользоваться методом двух указателей, получаем O(n3)
- Какие бывают методы двух указателей? Пусть даны и p[n,k] f[n,k]
- f[n,k] монотонна, тогда бинпоиск
- f[n,k] монотонна, p[n,k] монотонна, тогда классический метод двух указателей
- p[n,k] монотонна, тогда перебираем в соответствующем диапазоне p[n-1,k] ≤ p[n,k] ≤ p[n,k+1] и получаем суммарное время O(n2)
- Мерджим два улучшения, получаем O(n3/k)
- Другая идея, состояние = [l,r,k]. Изначально решение работает за O(n3k).
- Первое улучшение: k → k/2. Теперь O(n3logk).
- Второе улучшение: метод двух указателей при пересчете. Теперь O(n2logk). Успех.
- Тактика на контесте?
- Тут была пачка жизненных примеров...
- Геометрия (метод двух указателей, scanline, многоугольники, локализация)?