Блог пользователя amazing-hash

Автор amazing-hash, 10 лет назад, По-русски

Подскажите идею, как реализовать функцию прибавления на интервале в "Дереве отрезков", без рекурсивной реализации? Например для суммы. То есть после модификации отвечать на сумму на интервале.

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

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

Извиняюсь, но зачем? Я всё время пишу групповую модификацию DFS-ом.

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

    Да я и не спорю, что многие так делают. Все таки есть классический учебник e-maxx!

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

      Причина не только в е-максе. Лично я никогда не пользовался нерекурсивным деревом отрезков исключительно потому, что мне как-то не нравится для каждой задачи с запросами на отрезках придумывать специфичный только для нее алгоритм.

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

Ну как сказать)) захотелось и не смог! Хочу узнать теперь а как все-таки ! Да и пишу я его всегда не рекурсивно.

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

    Тут реализация с присваиванием на отрезке.

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

    Так же само, как и любой простой запрос на отрезке.

    Одним циклом спустится вниз, до того момента, как нам надо будет разойтись налево и направо. Потом один цикл пустить влево, и ещё один вправо.

    Вот тут я искал максимум на отрезке не рекурсивно, можешь попытаться разобраться

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

      Да реализовать не рекурсивно нахождение максимума и суммы я могу. Именно не могу прибавление на отрезке.

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

        Для прибавления ещё понадобится стек, в котором надо запомнить обход, и потом в обратном порядке обновить значения в вершинах.

        А вообще, это всё весьма бессмысленно =)

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

          Ну хорошо, если получится выложу. А почему бессмысленно так и не понял))

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

            Нет никаких преимуществ в сравнении с рекурсивной реализации.

            Хотя, судя по тому, что выложил NSV, я просто не умею такое нормально реализовывать.

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

Здесь приведена хорошая нерекурсивная реализация ДО с модификацией на отрезке. Спасибо indy256! Ещё на этом сайте можно найти другие реализации ДО и вообще много всего интересного.

Здесь и здесь можно прочитать про нерекурсивную реализацию ДО, а также про то, как делать отложенные операции. В целом, на этом сайте тоже много разных вкусняшек! И здесь уже спасибо, наверное, andrewzta :)

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

Я ведь не могу прибавить на интервале и потом ответить с учетом этих действий на запрос суммы на интервале? Мне ведь все равно придется для этого пересчитывать все вершины дерева на этом интервале. И если все таки это можно то как? Как я понял я могу ответить на запрос о значение конкретного элемента быстро после модификации на интервале (точнее это я могу).

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

    Можете. Petr рассказывал, как сделать такое с помощью дерева Фенвика, предлагаю уловить идею и сделать то же самое на дереве отрезков.

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

    Можете. Достаточно обычного проталкивания в запросах.