Блог пользователя doreshnikov

Автор doreshnikov, 13 месяцев назад, По-русски

Всем привет!

Подумал, может на Сodeforces кто-то поможет найти ошибку\построить контрпример. Если помните паросочетания в недвудольных графах, то проблема Куна следующая: нам надо найти дополняющую цепь, но мы можем прийти в нужную вершину по ребру не того типа, пометить ее как посещенную и уйти.

  1. Первая попытка решения проблемы: делаем dfs по вершинам типа (v, flag), где flag – тип ребра, по которому мы пришли. Это, очевидно, не работает: мы можем пройти и через (v, false), и через (v, true), так как это разные вершины, но тогда наш дополняющий путь в исходном графе не простой, и мы на самом деле не нашли дополняющую цепь.

  2. Вторая попытка решения проблемы: делаем все то же самое, но в явном виде запрещаем dfs идти в вершины, которые уже посещены (находятся на пути от старта до текущей вершины), даже если они были пройдены с другим флагом. Что-то вроде

vis[v, flag] <- false для всех v, flag
path = []

dfs(v, flag):
    vis[v, flag] = true
    path.add(v)

    for u : g[v], для которых (status[vu] != flag) && (u not in path) && (not vis[u, !flag]):
        dfs(u, !flag)

    path.pop()

Поскольку люди пишут сжатие соцветий, а я очень вряд ли умнее Эдмондса, который его придумал, то к моему «решению» есть контр-пример, либо оно просто долго работает, но я пока не осознал, почему. Надеюсь, что найдутся умные люди, которые каким-то чудом увидят этот пост и объяснят мне, где я не прав :)

Полный текст и комментарии »

  • Проголосовать: нравится
  • +58
  • Проголосовать: не нравится

Автор doreshnikov, история, 2 года назад, перевод, По-русски

Краткая информация

Прошу прощения за очередное длительное ожидание разбора, я обещал, что он будет появляться быстрее, но я немного приболел, и работа идет очень медленно.

Про задачу F:

И еще раз прошу прощения за жесткое ограничение по памяти в этой задаче. Мы не планировали специально отсекать решения с DFS или заставлять всех писать сложные оптимизации, просто исходный расчет был на решение, не использующее DFS. Прикладываю к разбору как раз то решение, которое мы ожидали, оно использует ~75MB памяти.

Видимо, Div. 3 раунды могут послужить хорошим опытом и для авторов. Постараюсь в следующий раз не допускать таких же ошибок :) Спасибо всем за участие и надеюсь увидеть вас в следующих раундах!

Разбор

1607A - Линейная клавиатура

Идея: doreshnikov, MikeMirzayanov

Разбор
Решение

1607B - Математический кузнечик

Идея: doreshnikov

Разбор
Решение

1607C - Устранение минимума

Идея: doreshnikov

Разбор
Решение

1607D - Сине-красная перестановка

Идея: MikeMirzayanov

Разбор
Решение

1607E - Робот на доске 1

Идея: MikeMirzayanov

Разбор
Решение

1607F - Робот на доске 2

Идея: doreshnikov

Разбор
Решение

1607G - Подготовка банкета 1

Идея: doreshnikov

Разбор
Решение

1607H - Подготовка банкета 2

Идея: MikeMirzayanov

Разбор
Решение

Полный текст и комментарии »

Разбор задач Codeforces Round 753 (Div. 3)
  • Проголосовать: нравится
  • +122
  • Проголосовать: не нравится

Автор doreshnikov, история, 2 года назад, перевод, По-русски

Всем привет!

Снова рады пригласить Вас принять участие в Codeforces Round 753 (Div. 3) – раунд для третьего дивизиона, который состоится во 02.11.2021 17:35 (Московское время). Раунд (снова) был составлен совместными усилиями меня и MikeMirzayanov. Задачи, разумеется, новые, но мы, как и раньше, надеемся, что Вам они понравятся :)

Большое спасибо MikeMirzayanov за прекрасные идеи задач и за помощь с написанием хороших условий и тестов. У меня пока все еще уходит довольно много времени на некоторые аспекты подготовки задач, так что для меня эта помощь достаточно заметна. (UPD: в итоге эта помощь оказалась еще больше, так что спасибо огромное еще раз).

Помимо этого отдельная благодарность RisingWizard, Capta1n_Shy, Mazaalai и GustavoMG, nizamoff, 2020akadaver, ashmelev, p0kemanbr и Kofta за тестирование раунда, а также, как обычно, Gassa за полезные замечания по тестам и решениям! Ну и наконец, спасибо всем, кто примет участие в раунде! Раунд будет содержать 8 задач и расчитан по сложности на участников с рейтингами до 1600, однако все желающие с рейтингом 1600 и выше могут зарегистрироваться на раунд вне конкурса.

Раунд пройдет по правилам образовательных раундов. Таким образом, во время раунда задачи будут тестироваться на предварительных тестах, а после раунда будет 12-часовая фаза открытых взломов. Мы постарались сделать сильные тесты, что, однако, не гарантирует, что фаза взломов будет безрезультатной.

Вам будет предложено 8 задач и 2 часа на их решение. Штраф за неверную попытку в этом раунде (и последующих Div. 3 раундах) будет равняться 10 минутам. Обратите внимание, что количество задач увеличилось по сравнению с изначально анонсированным!

Напоминаем, что в таблицу официальных результатов попадут только достоверные участники третьего дивизиона. Как написано по ссылке – это вынужденная мера для борьбы с неспортивным поведением. Для квалификации в качестве достоверного участника третьего дивизиона надо:

  • принять участие не менее чем в двух рейтинговых раундах (и решить в каждом из них хотя бы одну задачу)
  • не иметь в рейтинге точку 1900 или выше.

Независимо от того, являетесь вы достоверными участниками третьего дивизиона или нет, если ваш рейтинг менее 1600, то раунд для вас будет рейтинговым.

Всем хорошего настроения и удачи!

UPD: Выложен разбор задач!

Полный текст и комментарии »

  • Проголосовать: нравится
  • +320
  • Проголосовать: не нравится

Автор doreshnikov, история, 3 года назад, перевод, По-русски

1579A - Строковый пасьянс Казимира

Идея: MikeMirzayanov

Разбор
Решение

1579B - Сортировка сдвигами

Идея: doreshnikov

Разбор
Решение

1579C - Галочки

Идея: MikeMirzayanov

Разбор
Решение

1579D - Продуктивная встреча

Идея: doreshnikov

Разбор
Решение

1579E1 - Минимизация перестановки деком

Идея: MikeMirzayanov

Разбор
Решение

1579E2 - Оптимизация массива деком

Идея: doreshnikov

Разбор
Решение

1579F - Стабилизируй массив (И-версия)

Идея: doreshnikov

Разбор
Решение

1579G - Минимальное покрытие

Идея: doreshnikov, MikeMirzayanov

Разбор
Решение

Полный текст и комментарии »

Разбор задач Codeforces Round 744 (Div. 3)
  • Проголосовать: нравится
  • +141
  • Проголосовать: не нравится

Автор doreshnikov, история, 3 года назад, По-русски

Всем привет!

Приглашаем Вас принять участие в Codeforces Round 744 (Div. 3) – раунд для третьего дивизиона, который состоится во 28.09.2021 17:35 (Московское время). Раунд был составлен совместными усилиями меня и MikeMirzayanov, и мы очень надеемся, что задачи вам понравятся и покажутся достаточно интересными.

Отдельно хочется поблагодарить MikeMirzayanov за помощь как в составлении, так и в разработке задач для раунда. Это второй Div. 3 раунд, в создании которого я принимаю участие, но только первый, в котором я готовлю задачи полностью, так что без его руководства я бы потратил на это гораздо больше времени.

Помимо этого отдельная благодарность nizamoff, andreumat, QAZZY, Vladosiya, CtrlAlt, vladmart, Igorjan94, okwedook, ashmelev и Aris за тестирование раунда и фидбек по задачам, а также Gassa и geranazavr555 за вычитку и корректировку условий – благодаря вам этот раунд стал заметно лучше, чем мог бы быть без вашего вклада. Ну и наконец, спасибо всем, кто примет участие в раунде! Раунд будет содержать от 7 до 8 задач и расчитан по сложности на участников с рейтингами до 1600, однако все желающие с рейтингом 1600 и выше могут зарегистрироваться на раунд вне конкурса.

Раунд пройдет по правилам образовательных раундов. Таким образом, во время раунда задачи будут тестироваться на предварительных тестах, а после раунда будет 12-часовая фаза открытых взломов. Мы постарались сделать сильные тесты, что, однако, не гарантирует, что фаза взломов будет безрезультатной.

Вам будет предложено 7-8 задач и 2 часа 15 минут на их решение. Штраф за неверную попытку в этом раунде (и последующих Div. 3 раундах) будет равняться 10 минутам.

Напоминаем, что в таблицу официальных результатов попадут только достоверные участники третьего дивизиона. Как написано по ссылке – это вынужденная мера для борьбы с неспортивным поведением. Для квалификации в качестве достоверного участника третьего дивизиона надо:

  • принять участие не менее чем в двух рейтинговых раундах (и решить в каждом из них хотя бы одну задачу)
  • не иметь в рейтинге точку 1900 или выше.

Независимо от того, являетесь вы достоверными участниками третьего дивизиона или нет, если ваш рейтинг менее 1600, то раунд для вас будет рейтинговым.

Всем хорошего настроения и удачи!

UPD: Выложен разбор задач!

Полный текст и комментарии »

  • Проголосовать: нравится
  • +308
  • Проголосовать: не нравится

Автор doreshnikov, 3 года назад, По-русски

1547A - Кратчайший путь с препятствием

Идея: MikeMirzayanov

Разбор
Решение

1547B - Алфавитные строки

Идея: MikeMirzayanov

Разбор
Решение

1547C - Парное программирование

Идея: geranazavr555, MikeMirzayanov

Разбор
Решение

1547D - Взаимнорастущая последовательность

Идея: doreshnikov

Разбор
Решение

1547E - Кондиционеры

Идея: geranazavr555, MikeMirzayanov

Разбор
Решение

1547F - Стабилизируй массив (НОД-версия)

Идея: doreshnikov

Разбор
Решение

1547G - Сколько путей?

Идея: MikeMirzayanov

Разбор
Решение

Полный текст и комментарии »

Разбор задач Codeforces Round 731 (Div. 3)
  • Проголосовать: нравится
  • +228
  • Проголосовать: не нравится