Здравствуйте, уважаемые пользователи Codeforces!
Сначала, хотелось бы поздравить всех с наступающим.
Сегодня решил прорешать задачи из прошлых IZHO и наткнулся на одну интересную задачу. Вкратце:
Имеется двудольный граф с M (M≤2000) вершинами в первой доле и N (N≤30000) во второй; их соединяет K≤100000 дуг. Найти число отрезков во второй доле, дающее полное (т.е. размера M) паросочетание с первой.
Пока что решил только для N≤100, M≤50, алгоритмом Куна и перебирая L, R.
В одном из топиков, нашел разбор там написано:
F.3 Тесты 25-36 Стоимость 24 балла (по 2 за каждый; 72 всего) Ограничения N≤1000, M≤500
Теория: Если интервал [L..R] подходит, то подойдут также все интервалы {[L..X]|X = R, N}.
Решение: Перебор левой границы со скользящей правой, O(NM2).
F.4 Тесты 37-50 Стоимость 50 баллов (по 2 за каждый) Ограничения N≤30000, M≤2000
Решение: Перебор левой границы со скользящей правой, плюс оптимизации (как ни странно, хорошие результаты даёт дихотомический перебор новой правой позиции); также следует учесть возможность сохранения решений между шагами – как обычно и делается при использовании скользящего окна (однако же, использование этой техники уничтожает полезность дихотомии везде, кроме первого раза, при генерации начального значения – где, впрочем, она и должна принести ощутимую пользу). Общая оценка: O(M2logN + NM) (с применением скользящего окна).
И собственно вопрос: Как применять скользящее окно в этой задаче?