Rating changes for last rounds are temporarily rolled back. They will be returned soon. ×

Массовые операции на версиях персистентного дерева отрезков.

Revision ru5, by bobr_salavat, 2024-02-13 19:59:35

Предисловие:

Я не утверждаю, что мое решение самое лучшее/простое/оптимальное и на самом деле что оно вообще работает, просто придумал и решил написать сюда. Если у вас есть другое решение, можете предложить его в комментариях. Буду считать что вам знакомы следующие темы: неявное дерево отрезков, массовые операции на дереве отрезков, персистентное дерево отрезков.

Задача:

Дан массив А, из N целых чисел. Дано Q запросов двух типов: (1, L, R) — найти кол-во различных чисел на отрезке, (2, X, D) — заменить число на позиции X числом D. Будем считать что на запросы нельзя отвечать оффлайн. 1 <= A_i, D_i <= 10^9

Решение:

Для начала рассмотрим задачу без обновлений. Будем хранить массив B размера N, где B_i — индекс следующего элемента в массиве A равного A_i, или N+1 если такого не существует. Более формально, B_i = min j: j > i, A_j = A_i, если такой существует или N+1 иначе. Построим на персистентное неявное дерево отрезков, назовем его T, его версии будут храниться в массиве Vers. Пройдемся по массиву для каждого i: 1 <= i <= n добавим B_i в T и сохраним очередную версию в Vers_i. Теперь можно отвечать на запрос количества различных чисел на отрезке. Найдем для каждого значения присутствующего на отрезке A[L:R], последнее его вхождение в отрезок. Очевидно, что количество таких чисел для всех значений на отрезке — количество различных чисел на отрезке. Найти такое значение очень просто, это лишь количество чисел B_i на отрезке [L:R]: B_i > R. Найти такое количество можно воспользовавшись идеей префиксных сумм. Найти ответ для префикса длины R, и вычесть ответ на префиксе длины L-1. На префиксе произвольной длины K, можно посчитать ответ спуском по Vers_K+1.

Добавим запрос обновления элемента по индексу (2, X, D). Сначала поймем как меняется массив B. Помимо B, будем хранить в некотором дереве поиска MP (например std::map) пары (Value, Indices), где Value — значение присутствующее в массиве A, Indices — все индексы i: A_i = Value, в отсортированном порядке, при этом в MP будет сортировка только по Value. Теперь изменение значения в массиве A, равносильно удалению X из MP[A[X]], и вставить X в MP[D]. Рассмотрим операцию удаления из Indices. Пусть X1 — число слева от X в Indices, т.е. максимально меньшее X, X2 — число справа от X, т.е. минимальное большее X.

Tags структуры данных, запросы на отрезках, дерево отрезков, персистентность

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
ru25 Russian bobr_salavat 2024-02-21 14:35:46 15 Мелкая правка: 'времени и памяти.\n' -> 'времени и $O((N+Q)logN)$ памяти.\n'
ru24 Russian bobr_salavat 2024-02-21 11:24:49 6
ru23 Russian bobr_salavat 2024-02-21 11:24:09 0 (опубликовано)
ru22 Russian bobr_salavat 2024-02-21 11:22:15 6 Мелкая правка: 'амяти.\n\nЗадачу л' -> 'амяти.\n\nP.S.\nЗадачу л'
ru21 Russian bobr_salavat 2024-02-21 11:21:39 2
ru20 Russian bobr_salavat 2024-02-21 11:21:01 28
ru19 Russian bobr_salavat 2024-02-21 11:18:50 49
ru18 Russian bobr_salavat 2024-02-21 10:20:14 5
ru17 Russian bobr_salavat 2024-02-21 10:19:42 28 Мелкая правка: 'X$ из $MP_A_X$, и встав' -> 'X$ из $MP_(A_X)$, и встав'
ru16 Russian bobr_salavat 2024-02-21 10:18:11 2 Мелкая правка: 'X$ из $MP_A_X$, и встав' -> 'X$ из $MP_(A_X)$, и встав'
ru15 Russian bobr_salavat 2024-02-21 10:17:43 3284 Мелкая правка: 'X = X2. \n$\nТеперь о' -> 'X = X2. \n\nТеперь о'
ru14 Russian bobr_salavat 2024-02-21 10:15:16 2 Мелкая правка: 'X = X2. \n$\nТеперь о' -> 'X = X2. \n\nТеперь о'
ru13 Russian bobr_salavat 2024-02-21 10:15:01 4
ru12 Russian bobr_salavat 2024-02-21 10:14:46 52
ru11 Russian bobr_salavat 2024-02-21 09:05:29 2 Мелкая правка: 'ан массив А, из N цел' -> 'ан массив $А$, из N цел'
ru10 Russian bobr_salavat 2024-02-21 09:05:19 6 Мелкая правка: 'ан массив А, из N цел' -> 'ан массив $А$, из N цел'
ru9 Russian bobr_salavat 2024-02-21 09:05:00 2 Мелкая правка: 'ан массив А, из N цел' -> 'ан массив $А$, из N цел'
ru8 Russian bobr_salavat 2024-02-21 09:03:51 778
ru7 Russian bobr_salavat 2024-02-13 20:12:26 160
ru6 Russian bobr_salavat 2024-02-13 20:06:40 378
ru5 Russian bobr_salavat 2024-02-13 19:59:35 681
ru4 Russian bobr_salavat 2024-02-13 17:35:16 650
ru3 Russian bobr_salavat 2024-02-13 17:20:11 10
ru2 Russian bobr_salavat 2024-02-13 17:19:49 433
ru1 Russian bobr_salavat 2024-02-13 17:10:42 685 Первая редакция (сохранено в черновиках)