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

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

Пытаюсь сдать задачу http://www.e-olimp.com.ua/ru/problems/4483. Строю дерево отрезков: каждый узел дерева хранит два минимальных элемента соответствующего отрезка. Код: http://ideone.com/Kjk0BQ. Валится по памяти, видимо из-за строчки 110. Можно ли как-то оптимизировать создание массива каждый раз?

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

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

Нет, дело не в 110 строчке. Поменяйте местами размерности массива t, и да будет Вам счастье :). Вся проблема в том, что в жабе объект типа "массив" хранит некоторое количество дополнительной информации, а Вы создаете 106 массивов, когда можно обойтись всего двумя, поэтому и получаете MLE.

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

Instead of keeping 2 int variable, you can keep a boolean (b) and a integer (m). Boolean is the expected answer. The other variable contains the minimal element in its range. As K is fixed, so

tr [v].b = tr [v << 1].b || tr [v << 1 | 1].b ||
          (tr [v << 1].m + tr [v << 1 | 1].m < K);
tr [v].m = min (tr [v << 1].m, tr [v << 1 | 1].m);

Thus you can avoid that line :s

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

Я решил немного по-другому:в вершине дерева хранил минимум на отрезке и его индекс в массиве.Когда приходил запрос типа 1, я искал 1-ый минимум,на его месте поставил INF,искал 2-ой минимум ,и проверял,что сумма 1-ого и 2-ого минимумов меньше K.Затем я возвращал на место INF`а его настоящее значение.

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

    извращенец

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

      А мне кажется, трюк вполне оправданный и полезный. Например, примерно таким же способом сравнительно легко решается 1542. И вообще для поиска K минимальных элементов на отрезке самое то. Можешь предложить лучший способ, который потребляет О(n) памяти, а не O(nk), как если хранить в каждой вершине k минимумов?

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

        nlogn памяти и klogn на запрос: мёржим массивы в соответсвующих отрезках, пока не наберём k штук.

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

          Не уверен в том, что это лучше, но, как я понимаю, из такого способа можно ещё много чего интересного сделать... Постараюсь в ближайшее время разобраться с таким хранением ДО.

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

        Кстати сказать, сумму k минимальных чисел на отрезке можно находить за асимптотику вплоть до на запрос. Решение идентично решению задачи о k-ой порядковой статистики на отрезке, прочитать можно здесь.