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

Автор snarknews, история, 6 лет назад, По-русски

Стартовал третий раунд SNSS-2018, а также резервная версия второго раунда. Условия в объявленном внезачётным первоначальном варианте второго раунда приведены в соответствии с тестами, так что желающие могут в нём поучаствовать (вне зачёта SNSS-2018, разумеется).

Прямые ссылки на вход в раунды:

Раунд 2 (новый вариант), окончание 24.08 в 22:00

Раунд 3, окончание 22.08 в 22:00

Внезачётный раунд с исправленными условиями

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

»
6 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится

Раунды завершились, подкиньте, пожалуйста, идеи к задаче А третьего раунда и почему ее все так быстро решают?

  • »
    »
    6 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится

    Cперва можно придумать простое, но медленное решение: пока мы не получили ответ, возьмем две вершины четной степени из одной компоненты, найдем путь между ними и поменяем состояния ребер на нем. Количество вершин четной степени уменьшится на два, и ответ найдется всегда, если он есть. Так как, если осталась ровно одна вершина четной степени, то по соображениям четности суммарного числа степеней вершин ответ не достижим.

    После этого, наверное, можно придумать совершенно не связанное с предыдущим решение — обычную жадность. Пускаем дфс, который возвращает bool, означающий нужно ли брать в ответ ребро, по которому был сделан переход. Почему это работает? По соображениям предыщуего решения — если в каком-то поддереве дфса все вершины уже имеют нечетную степень, то возможно иправить все остальные вершины не трогая это поддерево. То есть, жадность работает =)

»
6 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

C 2-го раунда?

  • »
    »
    6 лет назад, # ^ |
      Проголосовать: нравится +10 Проголосовать: не нравится

    Вот мы находимся в какой-то компоненте связности. В какой-то момент времени некоторое ребро удалится и компонента распадётся на две. Построим дерево на этих компонентах, для каждой вершины которого сохраним время, когда эта компонента образовалась, и размер компоненты. Листьями в этом дереве будут компоненты соответсвующие вершинкам в исходном графе.

    Поиском в ширину найдём листья, до которых можно дойти, и выберем тот лист, где сумма на пути до корня (для каждой вершинки произведение размера компоненты на время существования этой компоненты) максимальна.

    Код тут.

»
6 лет назад, # |
Rev. 4   Проголосовать: нравится 0 Проголосовать: не нравится

Объявления о четвертом раунде не было, поэтому спрошу здесь: с помощью каких строковых структур можно одолеть задачу А из 4 раунда? Я решал похожую задачу div2E Марсианские строки, но там всего 100 строк в запросах и позиция префикса / суффикса не фиксирована.

UPD: вопрос снимается, успешно дорешал хешами