Мо онлайн

Revision ru5, by Noobish_Monk, 2025-07-17 01:21:15

Всем привет!

На контестах периодически попадаются задачи на запросы на отрезках. Большая часть задач даёт запросы в оффлайне, что даёт большую свободу действий, но всё же часто они сводятся к дереву отрезков, а иногда и алгоритму Мо. Однако иногда в задачах может оказаться так, что оффлайн её решает простой Мо, а в онлайне она становится интересной. В таких ситуациях некоторые люди пытаются поддерживать что-то типа $$$500$$$ разных состояний алгоритма Мо, но я вообще не понимал, о чём они.

Сегодня я сумел придумать версию онлайн Мо, работающую за $$$O(n^{\frac{5}{3}})$$$ времени и памяти в нормальных задачах. Для анализа асимптотики я буду считать, что $$$n = q$$$.

2043G - Problem with Queries

Для начала вспомним решение задачи оффлайн с помощью алгоритма Мо. Мы будем поддерживать массив количества вхождений $$$cnt$$$, а также текущее количество различных чисел $$$dif$$$. Тогда движение указателей $$$L$$$ и $$$R$$$ делается тривиально за $$$O(1)$$$, да и алгоритм Мо достаточно известный, так что не будем вдаваться в подробности реализации.

Однако вспомним анализ асимптотики с геометрической стороны. Размер блока для алгоритма Мо обозначим за $$$B \approx \sqrt{n}$$$.

анализ асимптотики

К сожалению в онлайн версии мы не можем выбирать порядок обхода квадратиков, да и в каждый квадратик нам может понадобиться заходить несколько раз, поэтому нужен другой подход. Понятно, что лишь одной парой указателей нам не обойтись, поскольку в таком случае на каждый запрос мы будем отвечать за $$$O(n)$$$, что долго. Назовём \textit{состоянием} всю необходимую информацию, которую мы обычно поддерживаем для одного отрезка. Я хочу создать несколько \textit{состояний}, чтобы от какого-то из них можно было быстро дойти до нашего запроса.

Выберем $$$B \approx n^{\frac{2}{3}}$$$. Теперь у нас мало квадратиков, всего $$$\frac{n^2}{B^2} = n^{\frac{2}{3}}$$$. Мы не будем делать никакого предподсчёта, сразу будем отвечать на запросы.

Ответ на запрос происходит так:

Определим квадратик, в котором находится запрос. Если

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
ru26 Russian Noobish_Monk 2025-07-17 12:58:41 0 (опубликовано)
en15 English Noobish_Monk 2025-07-17 12:58:31 0 (published)
en14 English Noobish_Monk 2025-07-17 12:58:12 14 Tiny change: 'e remains unaffected. \n\nWit' -> 'e remains the same. \n\nWit'
en13 English Noobish_Monk 2025-07-17 12:56:17 55
en12 English Noobish_Monk 2025-07-17 12:55:39 17
ru25 Russian Noobish_Monk 2025-07-17 12:55:12 13
ru24 Russian Noobish_Monk 2025-07-17 12:53:22 134
en11 English Noobish_Monk 2025-07-17 12:53:18 1016
ru23 Russian Noobish_Monk 2025-07-17 12:26:33 242
en10 English Noobish_Monk 2025-07-17 12:00:00 0 (saved to drafts)
ru22 Russian Noobish_Monk 2025-07-17 11:59:41 597 (сохранено в черновиках)
en9 English Noobish_Monk 2025-07-17 02:34:42 16
ru21 Russian Noobish_Monk 2025-07-17 02:24:50 0 (опубликовано)
en8 English Noobish_Monk 2025-07-17 02:24:43 0 (published)
en7 English Noobish_Monk 2025-07-17 02:24:27 2
ru20 Russian Noobish_Monk 2025-07-17 02:24:22 4 Мелкая правка: 'о сделать del и add. Но нам в' -> 'о сделать *del* и *add*. Но нам в'
en6 English Noobish_Monk 2025-07-17 02:22:40 57
en5 English Noobish_Monk 2025-07-17 02:21:49 5
en4 English Noobish_Monk 2025-07-17 02:21:06 40
en3 English Noobish_Monk 2025-07-17 02:20:35 10
en2 English Noobish_Monk 2025-07-17 02:20:21 4812
en1 English Noobish_Monk 2025-07-17 02:18:54 1582 Initial revision for English translation (saved to drafts)
ru19 Russian Noobish_Monk 2025-07-17 02:16:04 125 Мелкая правка: ' Создадим \textit{состояние}, например' -> ' Создадим _состояние_, например'
ru18 Russian Noobish_Monk 2025-07-17 02:13:30 1 Мелкая правка: ' Создадим \textit{состояние}, например' -> ' Создадим _состояние_, например'
ru17 Russian Noobish_Monk 2025-07-17 02:13:02 11 Мелкая правка: ' Создадим \textit{состояние}, например' -> ' Создадим _состояние_, например'
ru16 Russian Noobish_Monk 2025-07-17 02:12:46 71
ru15 Russian Noobish_Monk 2025-07-17 02:11:35 35
ru14 Russian Noobish_Monk 2025-07-17 02:08:01 9 Мелкая правка: 'n[cut]\n\n\nPrerequisites: Мо и желательно 3D Мо\n\nВ этом' -> 'n[cut]\n\nВ этом'
ru13 Russian Noobish_Monk 2025-07-17 02:07:23 18 Мелкая правка: 'n[cut]\n\n\nPrerequisites: Мо и желательно 3D Мо\n\nВ этом' -> 'n[cut]\n\nВ этом'
ru12 Russian Noobish_Monk 2025-07-17 02:06:29 42 Мелкая правка: 'n[cut]\n\n\nPrerequisites: Мо и желательно 3D Мо\n\nВ этом' -> 'n[cut]\n\nВ этом'
ru11 Russian Noobish_Monk 2025-07-17 02:05:26 50
ru10 Russian Noobish_Monk 2025-07-17 02:05:01 2
ru9 Russian Noobish_Monk 2025-07-17 02:04:43 64
ru8 Russian Noobish_Monk 2025-07-17 02:03:25 23
ru7 Russian Noobish_Monk 2025-07-17 02:02:38 2500
ru6 Russian Noobish_Monk 2025-07-17 01:48:38 2209
ru5 Russian Noobish_Monk 2025-07-17 01:21:15 84
ru4 Russian Noobish_Monk 2025-07-16 22:48:03 93
ru3 Russian Noobish_Monk 2025-07-16 22:46:01 1061
ru2 Russian Noobish_Monk 2025-07-16 22:34:01 1016
ru1 Russian Noobish_Monk 2025-07-16 22:08:23 1025 Первая редакция (сохранено в черновиках)