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

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

Всем привет!

Хотелось бы узнать как можно реализовывать сложные модификации на отрезке, в частности — присвоение/прибавление арифметической/геометрической прогрессии в обычном/персистентном дереве отрезков. Ссылка — не очень помогла, хотелось бы подробнее.

Задачи:

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

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

Ты умеешь одновременно поддерживать два типа запросов: прибавление числа на отрезке и запрос суммы на отрезке? Если да, то объясни, пожалуйста: а в каком месте прибавление арифметической/геометрической прогрессии принципиально сложнее?

  • »
    »
    9 лет назад, # ^ |
    Rev. 4   Проголосовать: нравится +11 Проголосовать: не нравится
    1. Да.
    2. Если я правильно понимаю, то можно хранить struct с необходимыми параметрами? Но что делать если нужно выполнять много различных операций (присвоение, прибавление, умножение, сумма, минимум и т.п)?

    А если случится так, что при обновлении какой-то вершины мы уничтожим её прошлый, возможно не законченный, апдейт?

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

      Если я правильно понимаю, то можно хранить struct с необходимыми параметрами? Но что делать если нужно выполнять много различных операций (присвоение, прибавление, умножение, сумма, минимум и т.п)?

      Да, можно использовать структуру. Как ни странно, если у тебя операций несколько, решение ровно такое же, только комбинирование становится сложнее.

      А если случится так, что при обновлении какой-то вершины мы уничтожим её прошлый, возможно не законченный, апдейт?

      Побуду капитаном: если ты докажешь, что в твоем конкретном случае это допустимо — все ОК, иначе — нет.

      P.S. Ты сам думать над задачей не хочешь — я тоже за тебя не буду. Ухожу из дискуссии.

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

        да вроде никто и не звал в дискуссию лично Вас.

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

          Ну, вроде как, никто никого в дискуссию лично не звал; любая реплика — просто высказывание своего мнения.

          Ну ок, пусть тема насчет людей, не желающих думать и/или не понимающих аспекты общения на форумах, остается табуированной — мне-то что?

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

            Карма у вас такая просто) Ну и к тому же тема довольно непростая, по крайней мере для синего юзера так точно, так что наезды про "не хочет думать" тут несколько неуместны.

            P.S. Мой код с EpicCode с прибавлением к отрезку [l, r] отрезка [2, 6, 12, 20, ...., (r - l + 1)(r - l + 2)]. Ключевыми являются структуры vertex и PolynomialSegmentTree. В vertex хранятся поля a, b, c — "ленивые" коэффициенты при i2, i, 1 соответственно, которые надо прибавить к каждой ячейке с индексом i. Мало ли, кому будет полезно:)

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

              тема довольно непростая, по крайней мере для синего юзера так точно

              Есть такая тема: синему юзеру скорее всего полезнее решать ad-hoc задачи и приобретать важные аспекты алгоритмического мышления (умение разбивать алгоритм на идеи, на которых он построен, и переиспользовать их, умение переходить от частного случая к общему и т.п.), чем изучать всякие супер-пупер деревья отрезков, которые в готовом виде нужны каждое для одной-двух задач и которые можно самостоятельно придумать, если у тебя есть вышеописанные навыки.

              наезды про "не хочет думать" тут несколько неуместны.

              Есть немного такого.

              Так или иначе, если ты задаешь вопрос в таком месте, где люди будут отвечать тебе "оторвавшись на 5 минут от других дел", стоит все-таки максимально подробно описывать, что именно ты понял, а что нет.

              Тут есть, конечно, одна тонкость. Если какой-нибудь красный задает вопрос вида: "У меня совсем нет идей, подскажите, пожалуйста, а как решать такую-то задачу?", то скорее всего подразумевается, что он просит ответ на 3-5 предложений, а полноценное решение он придумает сам. А если в такой же форме вопрос задает синий, то это обычно можно прочитать как: "Пожалуйста, разжуйте мне задачу целиком (так, чтобы у меня не возникло ни одного вопроса) и положите мне ее в рот (скиньте мне пример кода, который я могу заучить)". Я, конечно, утрирую, есть исключения в обе стороны, но в целом, как мне кажется, суть примерно такая.

              Вообще, все это можно сократить до одного предложения: "Покажи, что ты работал."

              • »
                »
                »
                »
                »
                »
                »
                »
                9 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится
                Есть такая тема: синему юзеру скорее всего полезнее решать ad-hoc задачи и приобретать важные аспекты алгоритмического мышления (умение разбивать алгоритм на идеи, на которых он построен, и переиспользовать их, умение переходить от частного случая к общему и т.п.),

                Хорошо. Не могли бы вы привести пару задач, или источник, или метод распознавания таких (ad-hoc) задач?

                чем изучать всякие супер-пупер деревья отрезков,

                В какой-то мере вы правы. Просто у меня есть желание заложить прочный фундамент знаний и любознательность.

                стоит все-таки максимально подробно описывать, что именно ты понял, а что нет.

                Согласен, свою проблему описал я не достаточно подробно.

                А если в такой же форме вопрос задает синий, то это обычно можно прочитать как: "Пожалуйста, разжуйте мне задачу целиком (так, чтобы у меня не возникло ни одного вопроса) и положите мне ее в рот (скиньте мне пример кода, который я могу заучить)".

                Это перебор.

                Теперь, основе вашего комментария переформулирую вопрос.

                Как можно реализовывать сложные модификации на отрезке, в частности — присвоение/прибавление арифметической/геометрической прогрессии? Если я правильно понимаю, то можно хранить struct с необходимыми параметрами, подправьте если не так. Но что если случится так, что при обновлении какой-то вершины в дереве мы уничтожим её прошлый, возможно не законченный, апдейт? Как бороться с этой проблемой? А также как делать множественную модификацию на отрезке в персистентном дереве отрезков?

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

                  ========================= Определись, тебе нужен "прочный фундамент знаний" или все же умение решать задачи. Если второе, то открывай тимус и решай где-то 400 задач. После этого легко станешь оранжевым, заодно и все базовые приемы выучишь.

                  А такое дерево отрезков, какое ты хочешь изучить, тебе ни разу в жизни не пригодится больше, ни на одном контесте, инфа 146%.

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

                  А если первое?

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

                  Спасибо за совет. Выбираю второе.

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

              Спасибо за код. Медитирую.