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

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

Добрый день, сообщество кф! Помогите пожалуйста разобраться с задачей http://acm.timus.ru/problem.aspx?space=1&num=1900.

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

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

Dp[i][j] — мы стоим на перегоне i, j раз включали машину, последний разна этом перегоне. Скольким людям мы можем промыть мозги? Переход — перебираем, где включали в прошлый раз. Тогда мозги промыли всем, кто сел после k и выйдет после i.Это за O(n^5).

Теперь две оптимизации:

1) Когда перебираем k идём от i по убыванию и по ходу прибавляем тех, кто сел на последней станции

2) Для каждой станции прибавляемая величина — это сумма на некотором суффиксе, а эти суммы можно пред подсчитать

Каждая оптимизация съедает одну линию и мы получили решение за O(n^3)

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

    мыслил примерно также, асимптотика O(n^3) получила TL. Есть ли какие-то ещё оптимизации, позволяющие уменьшить сложность, либо нужно просто допиливать код?

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

      По логике 500^3 должно работать. Надо код смотреть...

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

        по моему 500^3 никак не уложится в 1 секунду

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

          У меня сейчас ровно то решение, которое я сказал выше, прошло за 0,3 секунды без каких-либо упихиваний.

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

          5003 = 125000000 операций, или же примерно 108. Современные компьютеры переваривают до 109 достаточно спокойно, если нет медленных операций(деление, взятие по модулю, тригонометрические операции, возведение в степень и т.д.).

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

      Кстати, видимо, можно использовать divide-and-conquare optimization и получить O(n2 * logn)

      link

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

переписал код, теперь он работает 0,3 секунды, но получает wa 8