Sparse table за nlognlogn

Revision ru2, by Noinoiio, 2022-11-12 10:47:52

Sparse nlognlogn

Другие решения

Многим известен алгоритм Sparse table, который работает за O(n log n) на построение и O(1) и решает задачу static RMQ. Так же эту задачу решает алгоритм ФКБ за O(n) на построение и O(1) на запрос, но при этом имеет неприлично большую константу и неприятен в написании. В следствии чего ФКБ мало применим в олимпиадных задачах.

Идея 1

Построение

Разобьём массив, на котором мы будем отвечать на запросы на блоки по logn, в каждом из блоков построим обычный sparse table за O(lognloglogn) количество таких блоков = n/logn => суммарно эти построения будут выполнены за O(nloglogn). В каждом блоке посчитаем минимум и на этих минимумах построим также sparse за O((n/logn) * log(n / logn)) <= O(n).

Ответ на запрос

Заметим, что если левая(l) и правая(r) границы запроса полностью лежат в одном блоке, то мы можем ответить за O(1) за счёт насчитанного в блоке Sparse table, если же l и r в разных блоках то введем l1 = (l / logn) + 1, r1 = (r / logn) — 1. Очевидно что ответ будет минимум из минимума на суффиксе блока l и префиксе блока r, и минимума на вех блоках с номерами с [l1 : r1] => ответ на запрос происходит за O(1)

Код

Tags sparse table, структуры данных

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
ru10 Russian Noinoiio 2023-04-08 21:02:42 8 Мелкая правка: 'о level = loglogn, но также' -> 'о level = 2, но также'
ru9 Russian Noinoiio 2022-11-12 12:03:40 9 Мелкая правка: 'ние и O(1) и решает ' -> 'ние и O(1)на запрос и решает '
ru8 Russian Noinoiio 2022-11-12 11:34:52 77
ru7 Russian Noinoiio 2022-11-12 11:30:51 4 Мелкая правка: '\n\n\n\n\n' -> '\n\n\n\n\n\n\n' (опубликовано)
ru6 Russian Noinoiio 2022-11-12 11:22:51 417
ru5 Russian Noinoiio 2022-11-12 11:11:35 2792
ru4 Russian Noinoiio 2022-11-12 10:56:39 4
ru3 Russian Noinoiio 2022-11-12 10:55:43 2197
ru2 Russian Noinoiio 2022-11-12 10:47:52 889
ru1 Russian Noinoiio 2022-11-12 00:11:53 411 Первая редакция (сохранено в черновиках)