Доброго времени суток!
- Задача называется Сжатие координат.
Как написать Дерево отрезков, которое умеет считать сумму на интервале, но требует для хранения память, пропорциональную размеру изначального массива.И чтобы оно потребляло память, примерно пропорциональную количеству операций обновления. buildSegmentTree принимает параметр n — длину массива, но не сам массив. Считается, что изначально весь массив заполнен нулями.
Ссылка на задачу
Заранее Спасибо!!!
Как-то давно писал эту задачку: просто не нужно хранить каждый элемент дерева отрезков, достаточно хранить только изменённые, а про остальные всё известно — они одинаковые. такое работает если размер массива большой а операций на изменение мало, и массив изначально из одинаковых элементов
с памятью O(N) не получится сделать
Интересно было бы на код посмотреть, если можно.
Я так понимаю вы храните дерево в виде обычного массива. создайте структуру node, в которой объявите значение и указатели на левого и правого потомка, а при обращении к ним создавайте их
Неявное Дерево Отрезков
Можно подробнее о Неявном Дерево отрезков
В обычном дереве отрезке потомками вершины
V
будутV+V
иV+V+1
.Но в неявном ДО изначально у нас нету потомков, мы их дальше по ходу программы будем создавать. Для каждой вершины будем хранить номер его левого и правого потомка(0 если не существует). Если во время обновления потомка не существует то создаем его, а если в функции get не существует потомка то просто не будем туда спускатся(так как там мы все равно ничего не найдем).
Реализация update
Реализация get(в этом случае сумма)
Каждая функция создает максимум LogN дополнительной памяти.
"дерево который"?
Если заглянуть в профиль автора вопроса, то можно заметить, что русский — не родной для него язык, что может вызывать затруднения, грамматические ошибки и прочее при изъяснении.
Вообще, об ошибках и опечатках лучше писать в ЛС — таким образом вы не засоряете дискуссию.
"керево доторый"?