Задачи (примеры) к теме перебор
- Поезда: заказ = отрезок [Li, Ri] и кол-во пассажиров Ki. Вместимость поезда = C, нужно Summi (Ri-Li+1)*Ki → max
- Полный перебор за 2N
- Отсечение по ответу
- Самый длинный путь: разбор
- Правильная меморизация. O(2N) памяти.
- Отсечение по ответу: dep + count > Best
- Чтобы найти count каждый раз запускаем dfs
Задачи на Динамику
- Число способов пройти по шахматной доске конем из (1,1) в (N,N) (ходить можно только вправо-вниз).
- Маша и грибы (Маша ходит по матрице и собирает грибы, ходить можно только вниз и вправо, нельзя врезаться в деревья).
Задачи (примеры) на стурктуры данных
- Найти подотрезок с максимальной суммой за O(N).
- Найти подматрицу с максимальной суммой за O(N3).
Одномерные Структуры данных
- Не меняющийся массив - продолжение
- Минимум на отрезке фиксированной длины за O(1) с предподсчетом за O(N)
- Обобщение до матрицы
- Меняющийся массив - продолжение
- Дерево Фенвика для суммы [logN]
- 2D-Фенвик
- LCA-RMQ продолжение
- LCA в дереве = RMQ на отрезке (RMQ ±1) [Эйлеров обход за O(N)]
- RMQ на отрезке = LCA в дереве [постоение Декартового Дерева за O(N)], получили LCA за [O(NlogN), O(1)]
Декартово дерево
- (L, R) = Split(T, x)
- T = Merge(L, R)
- Add. Через Split-Merge и одним запросом сверху.
- Del. Через Split-Merge и одним запросом сверху.
- Find K-th.
- Количество и сумма всех элементов со значениями из [L..R]
- Построение за O(n)
- Randomized Trees (y можно не хранить)
Декартово дерево по неявному ключу
- Ключ = позиция элемента. Неявный, т.к. восстанавливается из size-ов.
- Split и Merge для дерева по неявному ключу.
- Вставка на i-ю позицию, удаление с i-й позиции
- Поменять местами два подотрезка массива.
- Reverse подотрезка массива.
- Прибавление на отрезке, присваивание на отрезке.