Можно ли где-то почитать про сжатое дерево отрезков? А то простое гугление на первый взгляд не выдает ничего хорошего.
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 4009 |
2 | jiangly | 3823 |
3 | Benq | 3738 |
4 | Radewoosh | 3633 |
5 | jqdai0815 | 3620 |
6 | orzdevinwang | 3529 |
7 | ecnerwala | 3446 |
8 | Um_nik | 3396 |
9 | ksun48 | 3390 |
10 | gamegame | 3386 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 167 |
2 | Um_nik | 163 |
3 | maomao90 | 162 |
3 | atcoder_official | 162 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 157 |
8 | TheScrasse | 154 |
9 | Dominater069 | 153 |
9 | nor | 153 |
Можно ли где-то почитать про сжатое дерево отрезков? А то простое гугление на первый взгляд не выдает ничего хорошего.
Название |
---|
А можно подробнее про то, что вы имеете в виду?
Структура данных, которая может выполнять те же операции, что и обычное дерево отрезков, только сами отрезки, на которых мы узнаем значение функции, имеют координаты не [1, n], где n — достаточно маленькое число, а, допустим, [1, 10^9].
Если отрезки, на которых будут запросы, известны заранее, то достаточно заранее сжать координаты и использовать то же дерево отрезков. В зависимости от видов запросов, может понадобиться для элементов сжатого массива помнить, какому отрезку исходного массива они соответствуют, и учитывать это в операциях. Например, сумма на отрезках исходного массива, превратится во взвешенную сумму на отрезках сжатого массива, с коэффициентами, равными длинам элементов сжатого массива в несжатом массиве. Коэффициенты постоянны, так что можно поддерживать дерево отрезков с взвешенной суммой, а не обычной.
Да ну. Как это не обойтись без дерева поиска.
Что мешает сделать динамическое дерево, у которого у каждой вершины ребёнок может равняться NULL, что будет значить значение по умолчанию для всех элементов дерева (например, для дерева с суммой — значение ноль для всех элементов поддерева). Тогда если раньше функция запроса имела вид get_sum(int l, int r, int L, int R, int v), то сейчас она будет иметь значение get_sum(int l, int r, node* v), причём для v == NULL она будет возвращать ноль.
Соответственно, когда надо будет обратиться к отрезку, вершины для которого, пока не существует, мы, спускаясь до него рекурсивно, просоздаём все несуществующие вершины дерева.
В общем, это ответ на вопрос автора.
Да-да, я уже понял и дописал)
Ок, теперь понятно.
Я когда не знал такого ресурса как e-maxx и как нормально закодить дерево отрезков, кодил именно динамическое дерево :)
может метод сжатых координат?
Если я правильно понял, то мне это объясняли как "неявное дерево", принцип следующий: мы не будем создавать вершину, пока она нам не понадобиться. На каждом запросе мы создадим не более logN вершин. Вот так.
Хотя может быть автор имеет ввиду дерево отрезком по сжатым координатам?
Нет, я имел ввиду первое. Интересно было бы на код посмотреть, если можно.
код не мой, но рабочий
Меняю ссылку на подходящую задачу на тимусе на аккуратно написанный (в будущем) мной код :). Мне понравилась идея, никогда не писал этого раньше.
Про задачи на тимусе ничего не знаю, но на Жаутыковской олимпиаде в этом году была задача на эту штуку.Вот, парень ссылку выкладывал на архив: http://mirror.codeforces.com/blog/entry/3567#comment-72617 Там она была задача "F" вроде.
Ну и правильная ссылка
Ну тут как раз можно обойтись вот таким методом http://mirror.codeforces.com/blog/entry/3952#comment-79961
Там изначально неизвестны отрезки.
Согласен, не внимательно прочитал.
Ну вот, например, я по крайней мере именно этим "ленивым" деревом отрезков сдавал http://acm.timus.ru/problem.aspx?space=1&num=1019
Если кому интересно, то вот код задачи F с Жаутыковской олимпиады 2012 с этим деревом: http://pastebin.com/rjXM0bJv