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

Автор Azret, история, 10 лет назад, перевод, По-русски

Привет, CF!

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

Позвольте мне начать — IOI 2006 Б. Пирамида.

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

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

This page may be useful.

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

Задачу Пирамида можно написать на 59 баллов. Перебираем все пирамиды и внутри них будем перебирать все возможные комнаты , а сумму в пирамиде и в комнате будем считать ДПшкой. Вот код.

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

    Да, именно так я и делал. У меня тоже 59. А как на 100?

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

      Наверное двумерное дерево отрезков.

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

        Ну да, в чистом виде.

        Нам надо считать сумму на подпрямоугольнике(это можно сделать префиксными суммами) и минимальный подпрямоугольник размера c*d(а вот для этого уже используется дерево отрезков.

        Теперь просто перебираем левый верхний угол пирамиды, выбираем лучшее положение для комнаты запросом к прямоугольнику размера (a-2)*(b-2) (то есть пирамиде без границ) к дереву отрезков и обновляем ответ.

        Итого O (n*m*log(n)*log(m))

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

          Минимумы на всех подпрямоугольниках одинаковых размеров можно и за O(n * m) с помощью очереди для минимума. Это делается аналогично одномерной задаче.

          Пусть надо предпосчитать для всех прямоугольников размера e * f. Cначала предпосчитаем минимумы на прямоугольниках 1 * f c помощью одномерной задачи. Потом аналогично предпосчитаем на прямоугольниках e * 1, но уже для результата предыдущего предподсчёта.

          вот решение исходной задачи на 100.

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

            Огромное спасибо! Весь сижу над этой задачей и наконец-то понял!

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

          Коммент старенький, но всё же. Эту задачу я всё таки сдал, но с помощью очереди. Написал 2D не рекурсивное деревое отрезков — TL.

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

O(n ^ 2 * log(n))

рандомные тесты проходит.

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

    Попробуй сдать, что ли. Например, сюда.

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

      а что там за 1 число в выходных данных? и еще там надо читать из файла? у меня везде вердикт ошибка исполнения.

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

        В семпле видимо бага в ответе, там надо 4 числа выводить. Файл или стандартный поток вроде неважно, если файлы, то input.txt/output.txt.

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

          кажется ошибка исполнения — это на самом деле МЛ.

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

          да это был МЛ. но не работает решение. плохо тестировал значит. 12 тестов пройдено.

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

      решение было изначально верное, но не укладывалось в МЛ(там всего 32 мб он). я поменял массив интов на массив чаров и стал ловить ВА(переполнение). Потом поменял на массив шортов и прошло.

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

Очередь (два стека). За O(N * M). Код

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

Вот он, редиска!

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

Следующая задача — IOI 2008 Б. Острова.

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

Next task — IOI 2008 B. Islands.