Как эффективно обрабатывать запросы вида "Найти сумму элементов, таких что x < a[i] < y на отрезке l < i < r" с изменением в элементе с помощью дерева отрезков?
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 3856 |
2 | jiangly | 3747 |
3 | orzdevinwang | 3706 |
4 | jqdai0815 | 3682 |
5 | ksun48 | 3591 |
6 | gamegame | 3477 |
7 | Benq | 3468 |
8 | Radewoosh | 3462 |
9 | ecnerwala | 3451 |
10 | heuristica | 3431 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 167 |
2 | -is-this-fft- | 162 |
3 | Dominater069 | 160 |
4 | Um_nik | 158 |
5 | atcoder_official | 156 |
6 | Qingyu | 152 |
6 | djm03178 | 152 |
6 | adamant | 152 |
9 | luogu_official | 149 |
10 | awoo | 147 |
Как эффективно обрабатывать запросы вида "Найти сумму элементов, таких что x < a[i] < y на отрезке l < i < r" с изменением в элементе с помощью дерева отрезков?
Название |
---|
ну когда ты строишь дерево отрезков , в функции build там где l==r проверяй если число соответствует твоему условию то t[v]=a[l]; а если нет то t[v]=0;
3d Mo
Пусть для каждой вершины дерева отрезков мы храним весь ее подотрезок в двоичном сбалансированном дереве (например, в декартовом дереве). Понятно, что для изменения в элементе небодимо обновить этот элемент в
отрезках. Теперь рассмотрим запрос суммы. Понятно, что весь отрезок запроса мы можем разбить на
отрезков, которые есть в дереве отрезков. Теперь для каждого такого отрезка нам необходимо найти сумму всех элементов, для которых верно x < ai < y. Это легко сделать с помощью двоичного сбалансиванного дерева (дополнительно храним и обновляем сумму на поддереве), в котором хранится весь этот отрезок.
Итого получаем
на запрос и
на обновление элемента.
Если запросы даны offline, то можно для каждой вершины дерева отрезка найти все значения, которые там будут в какой-либо момент, и сжать их (для каждой вершины свое сжатие). После этого мы можем использовать более "статическую" структуру, например, дерево Фенвика. Запрос будет тоже за O(log2n), но вроде константа бинпоиска (сжатие) + Фенвика меньше, чем у декартова дерева.
Хорошее замечание :)
В некоторых задачах, например, 785E - Антон и перестановка, без этого довольно сложно поместиться в ограничения по времени.