Как реализовать деревья сегментов с ленивым распространением?

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

http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor#Segment_Trees

В дополнение к приведенной выше ссылке также были некоторые блоги, но все они ссылались на одну и ту же тему.

Пример

Примером применения этой структуры данных может быть что-то вроде, скажем, мне дан диапазон чисел от 1 до n. Теперь я выполняю некоторые операции, такие как добавление некоторого постоянного числа в определенный диапазон или вычитание некоторого постоянного числа из определенного диапазона. После выполнения операций я должен назвать минимальное и максимальное число в заданном числе.

Очевидное решение состояло бы в том, чтобы выполнять сложение или вычитание каждого числа в заданном диапазоне одно за другим. Но это невозможно в ситуации, когда ни одна из выполняемых операций не велика.

Лучшим подходом было бы использование деревьев сегментов с методом ленивого распространения. В нем говорится, что вместо выполнения операции обновления для каждого номера по отдельности просто отслеживайте все операции, пока все операции не будут выполнены. Затем, наконец, выполните операцию обновления, чтобы получить минимальное и максимальное число в диапазоне.

Пример с реальными данными

Предположим, я дал диапазон [1,10], что означает числа 1,2,3,4,5,6,7,8,9,10. Теперь предположим, что я выполняю операцию, которая уменьшает числа в диапазоне [3,6] на 4, так что теперь числа будут выглядеть как 1,2, -1,0,1,2,7,8,9,10. Теперь я выполняю другую операцию, которая увеличивает числа в диапазоне [5,9] на 1, поэтому число теперь будет выглядеть как 1,2, -1,0,2,3,8,9,10,10.

Теперь, если я попрошу вас сказать мне максимальное и минимальное число, то ответ будет:

Maximum = 10

Minimum = -1

Это всего лишь простой пример. Реальная задача может содержать тысячи таких операций сложения/вычитания. Надеюсь, теперь все понятно.

Это то, что я понял до сих пор, но я думаю, что в Интернете нет единой ссылки, которая лучше объясняет концепцию и реализацию.

Может ли кто-нибудь дать хорошее объяснение, включая псевдокод для ленивого распространения в деревьях сегментов?

Спасибо.

23
задан dark_shadow 4 August 2012 в 19:45
поделиться