Please subscribe to the official Codeforces channel in Telegram via the link https://t.me/codeforces_official. ×

Truba's blog

By Truba, 9 years ago, In Russian

Здравствуйте, уважаемые пользователи 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) (с применением скользящего окна).

И собственно вопрос: Как применять скользящее окно в этой задаче?

  • Vote: I like it
  • +6
  • Vote: I do not like it