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

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

Привет, CF!

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

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

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

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

This page may be useful.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

O(n ^ 2 * log(n))

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

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

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

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

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

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

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

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

Next task — IOI 2008 B. Islands.