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

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

Хочу решить задачу: https://www.e-olymp.com/ru/problems/3252. Но меня смущает что n слишком велико( n <= 10^9 + 7).

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

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

Надо использовать динамическое дерево отрезков

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

    ограничение по памяти 64мб. Думаешь пройдет?

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

      Оно потому и динамическое, что ест мало :) Но конкретно в этой задаче проще использовать дерево фенвика, попросту заменив массив на map / unordered map

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

        http://paste.ubuntu.com/24764544/ Вот такая реализация дает memory limit

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

          Можно поменять на unordered и поставить при подсчете суммы проверку, что запрашиваемый элемент в дереве есть через count.

          Или же написать декартово дерево или динамическое дерево отрезков (можно опять же через map :D)

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

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

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

              По личному опыту могу посоветовать писать его не на указателях, а на массиве (тот же принцип — создаём когда нужно, только теперь для каждой вершины будем хранить int l, r; — указатели на сыновей и глобальный cnt — счётчик вершин, создание вершины выглядит так: l = cnt++; или r = cnt++; и т.д.), т.к. жрёт меньше памяти и работает быстрее (или, как минимум, одно из двух)

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

                Спасибо, учту.

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

                А еще лучше все-таки писать с массивом, но на указателях, а не индексах.