Помогите, пожалуйста, решить задачу "Женитьба" с X Жаутыковской олимпиады. Условие
Я нашел разбор этой олимпиады, но я его не понимаю :(
В разборе написано, что алгоритм Куна работает за (разве не за ?)
Если закрыть на это глаза, то я понимаю оценку : перебираем отрезки за и поверяем за Куном.
Но как получить из я не понимаю. Если применить идею, что если какой-то отрезок подходит, то подойдут все отрезки, содержащие его, то мы получим оценку .
Что происходит в последней части разбора я вообще не понял.
Теперь о том, как делал я.
Запустим плавающее окно. Проверять будем с помощью Диница, который должен находить паросочетание быстрее Куна ( против ). Но мы не будем каждый раз строить граф и находить паросочетание заново. При сдвиге правой границы добавим ребра в граф, а при сдвиге левой удалим ребра из графа, при этом откатим поток, который проходил по этим ребрам (наверное, что-то похожее имелось в виду в последней части разбора).
За сколько эта ерунда будет работать, я понятия не имею, но берет 62/100.
Как решить эту задачу? Имеет ли смысл использовать здесь Диница вместо Куна?
Давайте запустим два указателя по юношам только с Куном. Можно пересчитывать текущее паросочетание, добавляя или удаляя одну вершину. Что происходит если добавить вершину, тогда попробуем увеличить паросочетание из нее, если это получилось, тогда размер паросочетания увеличится на 1, иначе останется таким же. Если нужно удалить вершину, тогда она либо входит в паросочетание, либо нет, если нет, то можно смело ее удалять, это никак не повлияет на текущее паросочетание, иначе, освободится вершина в другой доли, которая входила вместе с удаляемой вершиной в паросочетание, тогда нужно попробовать улучшить паросочетание для той вершины которая входила с удаляемой в другой доли, если это получилось, значит, размер паросочетания остается таким же, иначе уменьшается на 1. Для простоты можно хранить метки насыщенности для двух долей, вместо одной. Теперь когда мы умеем добавлять/удалять вершину в паросочетание за 1 поиск в глубину, то мы можем запустить два указателя по юношам, и в зависимости от того равно ли паросочетание M, сдвигать правую или левую границу, на каждом шаге сдвигается либо левая, либо правая граница, таких сдвигов будет не более 2*N, на каждый сдвиг в худшем случае нужен поиск в глубину за O(N+M+K), но за счет маленькой константы это очень быстрый O(N(N+M+K)). Вот код который получает АС(Кун+2 указателя): Спасибо Burunduk1! http://pastebin.com/XPFRF7AY
Спасибо огромное!