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

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

Может быть я очень невнимательный, но пока что никто не создал блог для обсуждения регионального этапа 2020. А тем временем, если я правильно понимаю, первый тур прошел уже во всех регионах, так что задачи уже можно спокойно обсуждать (поправьте, если я неправ).

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

UPD1: Результаты первого дня регионов, писавших на:

UPD2: Второй тур уже почти закончился. Думаю, через 30-40 минут уже можно будет спокойно обсуждать задачи (если это не так, поправьте пожалуйста). Надеюсь, все (более-менее) довольны (более-менее) своими результатами).

UPD3: Результаты второго (и первого, местами) дня регионов, писавших на:

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

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

Решение D:

Заметим, что если мы увеличиваем $$$z[i]$$$ на 1 (и при этом $$$z[i]$$$ < $$$m$$$), то количество строк со значением 1 или не меняется, или увеличивается на 1(так как все элементы во всех столбцах различны).

Из этого следует, что существует ответ такого вида: $$$[m, m, ...., m, x, 0, ...,0]$$$.

Теперь чтобы найти такой ответ, достаточно бинарного поиска по длине префикса $$$m$$$, а затем бинарного поиска по $$$x$$$.

Асимптотика $$$O(nm * (log(m) + log(n)))$$$

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

    А можешь пожалуйста подробнее объяснить этот момент: "Из этого следует, что существует ответ такого вида: [m,m,....,m,x,0,...,0]?"
    просит не совсем понимаю, как именно это вытекает.

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

      Такой алгоритм: будем перебирать $$$i$$$ от $$$0$$$ до $$$n - 1$$$. Теперь увеличиваем $$$z[i]$$$ от $$$0$$$ до $$$m$$$. Понятно, что в какой-то момент у нас будет ровно $$$s$$$ единиц в значении строк и при этом наш массив всегда в процессе работы алгоритма имеет такой вид.

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

    Это решение можно оптимизировать до $$$O$$$($$$nm$$$). Типо просто перебрать все ответы и пересчитывать за $$$O$$$($$$1$$$)

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

      Простите, я слеповат. Это уже написали снизу)

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

Решение C:

Сначала для каждого элемента предпочитаем индекс первого элемента справа равного ему. Это можно делать например с помощью unordered_map.

Теперь для каждого элемента будем искать в скольких отрезках длины $$$1$$$, $$$2$$$, $$$3$$$.. он будет самым правым из чисел равных ему на отрезке. Очевидно, что если мы такое посчитаем для каждого элемента и каждой длины то мы получим ответ на задачу.

Рассмотрим пример

У нас массив {$$$2$$$, $$$3$$$, $$$1$$$, $$$4$$$, $$$6$$$, $$$4$$$, $$$3$$$, $$$3$$$, $$$1$$$, $$$57$$$} и мы рассматриваем первую единицу. Для каждой длины посчитаем в скольких отрезков этой длины содержится наше число

Колво: $$$1$$$ $$$2$$$ $$$3$$$ $$$3$$$ $$$3$$$ $$$3$$$ $$$2$$$ $$$1$$$ $$$0$$$ $$$0$$$

Длина: $$$1$$$ $$$2$$$ $$$3$$$ $$$4$$$ $$$5$$$ $$$6$$$ $$$7$$$ $$$8$$$ $$$9$$$ $$$10$$$

Легко заметить что верхний массив для любого элемента и массива будет иметь вид {$$$1$$$ $$$2$$$ $$$3$$$ .... $$$x$$$ — $$$1$$$ $$$x$$$ $$$x$$$ $$$x$$$ ... $$$x$$$ $$$x$$$ $$$x$$$ — $$$1$$$ ... $$$3$$$ $$$2$$$ $$$1$$$} Это очевидным образом представляется в виде сумм и разностей арифметических прогрессий. Значит мы свели задачу к прибавлению арифметической прогрессии на отрезке. Эта задача может быть решена за линейное время.

Итоговая асимптотика: $$$O$$$($$$n$$$)

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

    Может быть не очень читаемо(мой первый разбор)

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

      Может быть не очень читаемо

      Я всегда не очень хорошо понимаю другие разборы, так что у меня появились некоторые вопросы к твоему решению)) :

      1) Как быстро посчитать массив {1 2 3 .... x — 1 x x x ... x x x — 1 ... 3 2 1} для всех чисел в массиве, или представить их в виде арифметических прогрессий?

      2) Как это переходит в наш ответ, то есть как мы из наших прогрессий получим ответ?)

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

        2) Ну просто сумма вроде, мы же считаем в скольких отрезках длины 1, 2, 3.. он будет самым правым из чисел равных ему на отрезке

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

Другое (моё) решение C:

Давайте пойдем справа налево и будем поддерживать для каждого числа массива $$$1$$$ если число встречается впервые на данном суффиксе и $$$0$$$ иначе. Давайте посмотрим что у нас получится, если для всех суффиксов мы выпишем полученные последовательности $$$0$$$ и $$$1$$$ в таблицу. Например рассмотрим сэмпл (массив $$$1\,3\,2\,1\,2$$$):

Давайте заметим что $$$S_d$$$ это сумма на каком-то параллелограмме таблицы (мда). Для ясности, вот $$$S_3$$$ для нашего примера:

Ну, давайте посмотрим, как пересчитывается $$$S_{d+1}$$$ через $$$S_d$$$. Мы вычитаем верхнюю строку и добавляем справа диагональ. То есть примерно вот так (зеленое — удаляем, синее — добавляем):

Теперь, что нам надо сделать? Давайте посчитаем для каждого элемента, для каких длин $$$d$$$ он вносит вклад. Заметим, что элемент $$$i$$$ вносит вклад в длины не более $$$i$$$.

Кроме того, давайте посчитаем когда для этого элемента $$$1$$$ заменяется на $$$0$$$ (до этого момента во всех строках, в которые этот элемент входил, будет стоять $$$1$$$, а после — всегда $$$0$$$). Пусть это $$$when_i$$$ для $$$i$$$-ого элемента. Если же элемент до конца прохода будет первым на суффиксе среди равных ему, положим $$$when_i = -1$$$ (по сути это индекс ближайшего элемента равного ему, но стоящего левее). Тогда несложно заметить, что этот элемент вносит вклад во все длины не более $$$n - when_i$$$.

То есть нам нужно добавить, что элемент вносит вклад (увеличивает на 1) все длины от $$$1$$$ до $$$min(i, n - when_i)$$$, добавляясь как элемент на правой диагонали, прибавив $$$1$$$ на соответствующем отрезке. Это делается за линию префиксными суммами.

Теперь мы посчитали, по сути, для каждой длины сумму на последней диагонали. Теперь чтобы посчитать ответ для $$$S_d$$$, нужно в полученном массиве добавить к $$$d$$$-ому элементу $$$S_{d-1}$$$ и вычесть сумму на суффиксе длины $$$d$$$ (та самая верхняя строка). Первое мы уже посчитали, второе легко считается при проходе справа налево.

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

Снова другое решение на C (чем-то схожее с решением devid, если я случайно пересказал его, поправьте пж):
Заметим что все отрезки длины d состоят из какого-то отрезка d — 1 (в данном решении будет рассматривать, что это суффикc) и одного элемента слева.
Давайте подумаем как можно пересчитывать S(d) через S(d — 1):
По факту нам нужно просто не учитывать те элементы, которые уже были в d — 1, когды мы их добавили
Для этого давайте обозначим за next(i) = ближайщий справа элемент, равный a[i];
А pref(i) = количество различных на префиксе длины i;

Теперь S(d) = S(d — 1) — pref(d — 1) + кол-во элементов массива next от 0 до n — d — 1, больших d; pref(d — 1) мы вычитаем для того, чтобы не учитывать отрезок длины d — 1, являющий префиксом исходного массива(очевидно, что слева мы не можем добавить элементы). Считать мы его можем за n log n просто проходом сетом.

Как быстро считать третье слагаемое? Здесь я писал дд, мб можно что-то другое.
Давайте изначально добавим в дд все элементы массива next от 0 до n — 2.
Теперь будем искать кол-во элементов, больших 1 (можно просто сплитом);
После этого удаляем элемент на позиции n — 2;
Теперь ищем кол-во элементов, больших 2... Думаю алгоритм понятен.
Все значения записываем в массив. И теперь мы можем спокойно найти S(d) через S(d — 1)
S(0) = n, как база;

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

В этом году на Codeforces пишут 17 регионов. Вот результаты после первого тура: https://codeforces.me/spectator/ranklist/bbd85b80155bc7d5df6e5681729d7f27

Я пока не понял подробности, но меня попросили официально временно не публиковать эту ссылку. Извините, ссылка более недоступна.

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

Хабаровский край (классы: 11, 10) https://imcs.dvfu.ru/cats/main.pl?f=rank_table;cid=3033335;sid=;sites=1178986

Приморский край (классы:10, 11, 9, 10) https://imcs.dvfu.ru/cats/main.pl?f=rank_table;cid=3033335;sid=;sites=1175454

Камчатский край https://imcs.dvfu.ru/cats/main.pl?f=rank_table;cid=3033335;sid=;sites=1217892

Суммарная таблица по всем трём регионам за оба тура (11, 10, 9, 11, ?): https://imcs.dvfu.ru/cats/main.pl?f=rank_table;cache=1;clist=3033335,3033343;hide_ooc=1;hide_virtual=1;sid=

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

Элегантное (имхо) решение на С.

Пусть изначально все $$$S[i] = 0$$$, теперь найдём вклад каждого индекса в ответ.

Я утверждаю, что элемент $$$a[i]$$$ даёт вклад во все отрезки, в которых $$$i$$$ является первым вхождением этого элемента (иначе, впервые "открывает" этот элемент другой индекс, вклад принадлежит именно ему). Как это формализовать: все отрезки $$$[l, r]$$$, при $$$prev[a[i]] < l <= i$$$ и $$$i <= r < n$$$, нумерация с 0, $$$prev[x]$$$ — индекс предыдущего вхождения типа задания $$$x$$$.

Теперь понятно, как это делать за $$$O(n^3 log n)$$$, можно от лога избавиться если сжать координаты (отпадает необходимость в map).

Как это делать за квадрат? Давайте разберёмся, что же происходит. Мы итерируемся по $$$l$$$ от $$$prev[a[i]] + 1$$$ до $$$i$$$, включительно. На каждой итерации мы рассматриваем отрезки с правыми концами от $$$i$$$ до $$$n - 1$$$, крайние длины соответственно будут $$$i - l + 1$$$ и $$$n - i$$$. Это по сути, прибавление 1 на отрезке. Так как сначала идут все запросы, а потом нужно вывести значение, можно сделать прибавление за $$$O(1)$$$ — просто завести массив флажков $$$flag$$$, классический приём, кто не в курсе. Тогда для прибавления единицы на отрезке $$$[l, r]$$$, мы просто делаем flag[l]++ и flag[r + 1]--, потом уже проходимся по массиву, обновляем текущее значение на значение флажка в данном индексе, и это значение выходного массива $$$S$$$ в данном индексе.

До фулла отсюда недалеко. Заметим, что все увеличения флажков на 1 (при каком-то $$$i$$$) находятся в подряд идущих индексах (очевидно, так как мы итерируем $$$l$$$ по одному). А поэтому, можно взять самые кратчайшие длины для левейшего и правейшего $$$l$$$, а также соответственные максимальные длины. Для первых мы делаем запрос на увеличение 1 на отрезке массива флажков (это важно, не конечного массива!!), аналогично с последними, только увеличение на -1. После этого мы восстанавливаем значения флажков, и уже с их помощью достраиваем массив.

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

в D есть решение за O(nm), по каждой строке можно построить дерево где val[2n-1] корень,а x[i]ые — листья. Отсортируем подсчётом столбцы, пусть изначально все z[i] = 0, будем увеличивать z[0] на 1 пока z[0] < m, z[1] и тд когда z[i] увеличится на 1 лист в некотором дереве станет 1(до этого он был 0), пойдём по дереву от листа изменяя значения в вершинах до первой 1 или до первой вершины с op = and у которого другой потомок равен 0, если мы дошли до корня значить количество True увеличилось на 1. Будем делать так пока кол-во true не станет равно s. В итоге по каждому ребру дерева будет не > 1 прохода, Увеличений z[i] будет не > mn.

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

Мне за последние 30 минут стало немного страшно за завтра. Это было запланировано?

upd. в случае падения тестирующей системы, продлят ли нам тур на время крэша? если нет, что будут делать в такой ситуации?

upd2. Прошу прощения за панику, тур прошёл великолепно :)

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

    Не понял объясни)

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

      Сайт по программированию под названием Codeforces прилег поспать примерно на полчаса.

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

        А ты на кф писал? Если да расскажи как прошло)

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

          Первый день очень круто прошел, очередей вообще не было. Посылки тестировались не больше минуты.

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

            Круто! Рад что теперь можно нормально писать) Бтв на ejudge все тоже было прекрасно.

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

Можете пожалуйста объяснить решение задачи B на полный балл

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

    По условию задачи, штраф выдают за максимальное превышение скорости на всей дороге. Отметим, что там также указано, что это превышение должно быть гарантированным, то есть мы не имеем права выписать штраф за превышение на $$$x$$$ м/с, если существует план поездки, где максимальное превышение меньше (иными словами, данные о въезде и выезде не дают нам право утверждать, что водитель гарантированно хотя бы в один момент превысил скорость на такую величину).

    Окей, разобрались с формулировкой. Теперь поймем следующий полу-очевидный факт: в лучшем случае автомобилист двигался с одинаковым превышением по всей дороге. И только за это превышение мы сможем выписать штраф.

    Вот почему (полу-очевидно)

    Тогда понятно, что мы ищем некоторую величину, на которую превысил скорость в лучшем случае водитель во время поездки. О ней мы только знаем следующее: двигаясь с таким превышением, путь водителя займет в точности $$$t - s$$$ секунд.

    Еще один очевидный факт:

    Таким образом, функция $$$T(up)$$$, где $$$up$$$ — это превышение, а $$$T(up)$$$ — время, затраченное на поездку, монотонно убывает. Это значит, что мы может найти требуемое $$$up' : T(up') = t - s$$$ с помощью двоичного поиска. На каждом раунде поиска мы можем честно посчитать, за сколько проедет водитель каждый участок дороги и просуммировать результаты.

    Итак, получили $$$up'$$$. Еще одним бин. поиском по массивам $$$a$$$ и $$$f$$$ найдем, какой штраф за это придется выписать нарушителю (ведь превышения там отсортированы заранее по возрастанию).

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

    Итоговая асимптотика: $$$O(q \cdot n \cdot \log m + m)$$$.

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

      Второй бинпоиск не нужен же, и так нашли позицию превышения i, тогда f[i] — штраф

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

      А можешь пояснить откуда появилось +m в асимптотике? (решение, кста, классное)

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

Ребят, 2 года назад на всерос брали примерно: 120 из 11, 80 из 10 и 60 из 9

1 год назад примерно всех по 80,с чем это связано?

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

Такое ощущение, что в этому году 10 классу может не хватить и 650 баллов для отбора

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

    Откуда такие догадки ?

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

      D-шка, решившаяся примитивной динамикой на 53 балла, натолкнула на эту мысль. И действительно, 100-е место в мск — 630 баллов. 650 баллов, похоже хватит, но запас совсем крохотный.

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

Решения второго дня:

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

    Я писал в D корневую, не успел отдебагать :( Потом услышал, что она ни у кого не заходила. Получилось ли у кого-то все же запихнуть?

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

      Да, насколько я знаю devid все-таки сдал(если это не так, поправьте пожалуйста).

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

        Сдал). Если интересно — разбор ниже.

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

      У меня корневая с первого раза зашла. Сливал за $$$O(4^3)$$$.

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

        Ты очень крутой, мы все тобой гордимся.

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

        А я сливал последние 2 часа, потому что руки из одного места

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

        А как сливать за куб? Расскажи pls.

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

          В разборе комментом ниже есть)

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

          Перебираем количество плакатов в начале первого блока, в конце первого $$$a$$$ и в конце второго, если хранить в блоке $$$dp[i][j]$$$ — ответ, если мы берем в начале не более $$$i$$$ и в конце ровно $$$j$$$, то нам не нужно перебирать количество в начале второго, а оно просто равно $$$4 - a$$$.

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

Мои решения, насколько я понимаю, отличающиеся от авторских(?):

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

Предварительные результаты:

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

А в Кемеровской области произошёл мем. Пошёл сильный снегопад и гибдд не разрешил детям ехать на автобусе в город, чтобы писать второй этап (дети для подготовки собираются в лагере за неделю до олимпиады). В итоге область пишет олимпиаду в понедельник с другими заданиями. Явно будут другие баллы, никаких равных условий. Дети будут сидеть в лагере еще два дня, откуда им взять еду и места жития, там же новые подъедут

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

Кто может объединить все результаты в одну табличку?

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

    Пока всех нет — никто, но вчера вроде где-то объединяли все известные в табличку (по первому дню).

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

На московском сайте материалы выставили: https://olympiads.ru/moscow/2019-20/vsosh/region_start.shtml

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

Сюда свел оба дня многих регионов

https://docs.google.com/spreadsheets/d/1QrJ7RYvNthgGsyq1nE0DSziU402mloF6zusSIse1ypQ/edit#gid=574526530

Москвы естественно нет

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

Кто знает, когда будет дорешка?

»
5 лет назад, # |
Rev. 4   Проголосовать: нравится +11 Проголосовать: не нравится
Альтернативное решение к задаче B2, написанное мной во время контеста.

UPD: кстати, такое решение может работать и за $$$O(n^2)$$$, если заранее посчитать до максимального $$$n$$$, $$$cnt[i][j]$$$ — количество делителей $$$i$$$, меньших $$$j$$$. Тогда можно совершать переходы в основной динамике за $$$O(1)$$$.

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

Результаты Ижевска: https://bacs.cs.istu.ru/

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

Как думаете какой проходной балл у 11 класса в этом году?

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

Задачи доступны для дорешивания на Яндекс.Контесте:

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

А какой проход будет примерно по 9 классу

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

Результаты новосибирской области https://drive.google.com/file/d/1SRlD5QcucDz_hQPmm-tkbEV5afForm_6/view?usp=sharing

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

а я зделал 1 и 5 задачки и куснул 3 на 22 балла

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

Официальные и окончательные результаты Челябинска: https://rcokio.ru/files/upload/olimp/vseros/itog_19-20/informatika.xlsx

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

Уже не знаю, насколько это актуально, но раз в "странных опросах" до сих пор обсуждают асимптотику к B2, представлю решение за $$$O(n \log ^2 n)$$$. Такую асимптотику можно получить несложной оптимизацией вышеописанного решения с ДП (достаточно только заметить, что полезных состояний для вычисления ответа всего $$$n \log n$$$).

Эта реализация позволяет получить ответ для $$$n = 4 \cdot 10^5$$$ за одну секунду:

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

Проходные баллы: 9: 543, 10: 607, 11: 644