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

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

1 августа 2019 года в 19:30 (время московское) открылся первый этап SnarkNews Summer Series 2019. Как и несколько предыдущих серий, SNSS-2019 пройдёт на системе Яндекс.Контест. Опубликовано расписание серии.

По просьбам участников отдельно публикую ссылку для регистрации и входа в первый раунд. В комментариях к этому сообщению по окончании раунда в соответствии с расписанием можно будет обсудить задачи первого раунда.

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

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

Насколько я понимаю, то первый раунд окончен. Как решать задачу А?

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

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

    1. Эта точка -- вершина многоугольника и лежит на одной окружности.
    2. Эта точка лежит на одной из сторон и на двух окружностях.
    3. Это точка пересечения трёх окружностей, и она лежит внутри многоугольника.

    Генерируем все точки-кандидаты, для каждой из них проверяем, что она лежит в многоугольнике, и если да, то обновляем ей ответ.

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

      Альтернатива — бинпоиск по ответу, а дальше все то же, только теперь надо пересекать не три любых объекта, а два любых объекта. Работает примерно столько же, так как мы одну линию заменили на бинпоиск, в данных ограничения — примерно одинаково.

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

А как правильно решать задачу C?

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

    Решение за куб. Идея: для любых трёх непересекающихся подпрямоугольников можно найти разбиение исходного прямоугольника на 3, что наши подпрямоугольники лежат в этих по одному. Так разбить можно принципиально двумя разными способами:

    +----+   +--+-+
    +----+   |  | |
    +----+   +--+-+
    +----+   +----+
    

    Насчитаем 6 динамик. Первая -- это dp[i][j]= максимальной сумме на подпрямоугольнике с вершинами в верхнем левом углу и (i, j), следующие 3 -- то же самое с другими углами, следующая -- dp[i][j]= максимальной сумме на подпрямоугольнике, содержащемся в столбцах от i до j, последняя -- то же, но со строками. Легко понять, как через эти динамики посчитать ответ. Динамики считаются так:

    Идём по строкам сверху вниз, для каждой пары (i, j) помним минимальную сумму всех чисел на прямоугольнике между этими столбцами, что мы встречали. В итоге для любой тройки $$$(r, c_1, c_2)$$$ мы узнаем максимальную сумму чисел на всех прямоугольниках $$$[x_1, x_2]\times[c_1, c_2]$$$, где $$$x_1 \leqslant x_2 \leqslant r$$$, через это можно посчитать первые 5 динамик, последнюю считаем так же, но для строк.

    Не знаю, как объяснить нормально, зашло за 0.3с, а Вы как делали? Там, кажется, байт на 4 степень, судя по тайм лимиту

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

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