Изменения

Перейти к: навигация, поиск

Корневая декомпозиция с операциями: get, insert, erase

516 байт убрано, 19:06, 4 сентября 2022
м
rollbackEdits.php mass rollback
== Построение ==
Задача:
<noinclude>
{{Задача
|definition = Пусть дан массив <math>A</math> размерности <math>n</math> и <math>m</math> запросов вида: добавить элемент <math>y</math> после элемента <math>x</math>, удалить элемент с индексом <math>x</math>, посчитать сумму на отрезке <math>[l, r]</math>.
}}
</noinclude>
<includeonly>{{#if: {{{neat|}}}|
<div style="background-color: #fcfcfc; float:left;">
<div style="background-color: #ddd;">'''Задача:'''</div>
<div style="border:1px dashed #2f6fab; padding: 8px; font-style: italic;">{{{definition}}}</div>
</div>|
<table border="0" width="100%">
<tr><td style="background-color: #ddd">'''Задача:'''</td></tr>
<tr><td style="border:1px dashed #2f6fab; padding: 8px; background-color: #fcfcfc; font-style: italic;">{{{definition}}}</td></tr>
</table>}}
</includeonly>
Cделаем следующие действия:
</code>
Построение, происходит за <tex>O(n)</tex> времени.
== Операция split==
Данная операций нужна для реализации операций: <math>\mathrm{insert}</math>, <math>\mathrm{erase}</math>, <math>\mathrm{get}</math>. Она позволяет разделить один блок на два других с целью создания разреза, который необходим в других операциях. Индекс <math>i</math> называется разрезом, если не существует такого актуального блока, которому принадлежит индекс <math>i</math> и <math>i + 1</math> одновременно.
Пусть получен запрос на выполнение операции для индекса <math>x</math>. Этот индекс входит ровно в один блок массива <math>B</math>, пусть индекс этого блока {{---}} <math>ind</math>. После операции <math>\mathrm{split}</math> этот блок поделится на <math>[L[ind], x]</math> и <math>[x + 1, R[ind]]</math>, если <math>x</math> был в середине блока, иначе <math>x</math> уже является разрезом и никакая операций не требуется. Как мы видим после операции у нас появилось максимум два новых блока.
Для удобства реализации в массивы <math>B, L, R</math> можно только дописывать новую информацию в конце, что соответствует созданию новых блоков.
first = createNewBlock(L[ind], x)
second = createNewBlock(x, R[ind])
T.erase(ind) <font color=green>// операций T.erase(x) удаляет элемент под номером x и сдвигает массив T. Время работы <mathtex>O(|T|)</mathtex> </font> T.insert(ind. first) <font color=green>// операций T.insert(x, y) вставляет в массив T после индекса x значение y и сдвигает массив. Время работы <mathtex>O(|T|)</mathtex> </font>
T.insert(ind + 1, second)
'''return''' ind
1632
правки

Навигация