Boring Problem#232

Boring Problem (Editorial)

Спершу згорнемо потрійну суму в одну.

У виразі пара позицій з i \le j дає внесок |s_i - s_j| рівно стільки разів, скільки підрядків її містять, тобто i \cdot (n - j + 1). Отже,

\mathrm{cost}(s) = \sum_{i \le j} i \,(n - j + 1)\, |s_i - s_j|.

Тепер зрозуміло, що для кожної позиції важливі дві ваги: «ліва» w_i = i і «права» v_i = n - i + 1. А сама різниця |s_i - s_j| залежить лише від літер, яких усього .

Це підказує дерево відрізків, у вузлі якого зберігаємо:

  • — відповідь для відрізка, що відповідає вузлу;

  • — суму ваг w_i по позиціях відрізка з літерою ;

  • — суму ваг v_i по позиціях відрізка з літерою .

Злиття двох вузлів: пари, у яких обидві позиції в лівій (або обидві в правій) частині, уже враховані в дитячих . Залишаються пари « ліворуч, праворуч», для яких i < j, тому внесок дорівнює

\sum_{c}\sum_{d} |c - d| \cdot W_{\text{лів}}[c] \cdot V_{\text{прав}}[d].

Масиви і у злитті просто додаються поелементно.

Наївно ця подвійна сума коштує 26^2 на злиття, що при n, q \le 2 \cdot 10^5 уже забагато. Але її легко звести до : для кожного

\sum_c |c-d|\, W[c] = d \!\!\sum_{c<d}\!\! W[c] - \!\!\sum_{c<d}\!\! c\,W[c] \;+\; \!\!\sum_{c>d}\!\! c\,W[c] - d \!\!\sum_{c>d}\!\! W[c],

а всі чотири суми беруться з префіксних сум масивів та c \cdot W[c], які будуються за .

Тоді побудова дерева коштує , а кожен запит (зміна однієї літери) — \mathcal{O}(26 \log n), бо перераховуються лише вузли на шляху до кореня. Відповідь — у корені; виводимо її до всіх запитів і після кожного.

Усі обчислення ведіть за модулем 10^9+7, не забуваючи додавати модуль після віднімань.