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

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

Привет.

Как решать задачи A, C и H с этой тренировки? Буду очень признателен.

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

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

В задаче С будем использовать дерево отрезков. Так как всего 366 операций обновления, значит просто будем перестраивать все дерево отрезков с каждой операцией обновления.

В задаче H нужно было посчитать динамику dp[i][j] — максимальная длина строки палиндрома на подстроке s[i..j], которую можно получить путем вычеркивания минимального количества символов. Затем просто пройтись по всем парам (l, r) и найти максимальный ответ, т.к. количество символов которые стоит удалить чтобы получить палиндром на подстроке s[i..j] = j — i + 1 — dp[i][j].

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

    Так как всего 366 операций обновления, значит просто будем перестраивать все дерево отрезков с каждой операцией обновления.

    Когда-нибудь я научусь внимательно читать условия задач, но только не сегодня :) Ведь почти два часа убил...

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

A — как любят говорить в таких случаях, "несложными преобразованиями..." :) Пускай ответ без последней цифры х имеет длину L, тогда (10*x+6)*3=6*10^L+x; отсюда x*29=6*(10^L-3); далее 10^L=3 mod 29. Осталось только найти k-ое по порядку подходящее L. Заметим, что период 10^L mod 29 равен 28 — дальше только подставить все значения во все полученные выражения по порядку и посчитать ответ:)

C — дерево отрезков. При запросе обновления — перестроим наивным образом всю ту часть дерева, которая изменилась. Мы можем себе это позволить, потому что есть ограничение на число обновлений среди запросов:) При запросе произведения — вытаскиваем произведение из дерева отрезков.

Вроде бы возможно альтернативное решение, поскольку у нас простой модуль — считать частичные произведения на суффиксах, и ответ на отрезке представлять в виде частного двух произведений. Но здесь надо будет аккуратно обработать возможные ноли (не учитывать их в произведениях и считать отдельно).

Н — считаем стандартную динамику "сколько нужно изменений, чтобы сделать подстроку от l до r палиндромом". Считаем ее по подстрокам от коротких к длинным — для подстроки мы можем либо выбросить один из крайних символов, и перейти к строке, которая короче на 1, либо бесплатно выбросить пару крайних символов, если они одинаковые — и перейти к строке, короче на 2. Далее среди всех состояний динамики, у которых значение не больше K — выбираем лучшее.

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

    Задача C:

    Почему первое решение получает ТЛ7, а второе заходит?

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

      Если я правильно понял, в чем различие — при вызове build мы обрабатываем все дерево (О(N) вершин); при вызове update мы обрабатываем О(logN) вершин. Если update вызывать для каждого элемента массива, а r-l соизмеримо с N, то получаем суммарно О(NlogN). Это ощутимо хуже О(N) в случае одного вызова build — отсюда и TL.

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

        Почему-то думал, что build работает за NlogN.

        Спасибо за разъяснение)

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

В задаче С можно написать SQRT-декомпозицию.

Мой код.

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

прочитал условия. Не грешновато ли давать школьникам задачи из сериала категории 18+? :)