Я искал в Интернете о реализации деревьев сегментов, но ничего не нашел, когда дело дошло до ленивого распространения. Были некоторые предыдущие вопросы о переполнении стека, но они были сосредоточены на решении некоторых конкретных проблем SPOJ. Хотя я думаю, что это лучшее объяснение деревьев сегментов с псевдокодом, но мне нужно реализовать его с ленивым распространением. Я нашел следующие ссылки:
http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor#Segment_Trees
В дополнение к вышеуказанной ссылке некоторые блоги также были там, но все они ссылались на один и тот же поток.
Пример
пример приложения этой структуры данных будет что-то вроде, скажем, мне дали диапазон чисел от 1 до n. Теперь я выполняю некоторые операции, такие как добавление некоторого постоянного числа в определенный диапазон или вычитание некоторого постоянного числа из определенного диапазона. После выполнения операций я должен указать минимальное и максимальное число в указанном номере.
Очевидным решением будет выполнение сложения или вычитания каждого числа в заданном диапазоне один за другим. Но это не может быть осуществимо в ситуации, когда никакие операции не являются большими.
A лучший подход будет использовать сегментные деревья с ленивой технологией распространения. Он говорит вместо того, чтобы выполнять операцию обновления по каждому номеру отдельно, просто отслеживайте все операции до тех пор, пока все операции не будут выполнены. Затем, наконец, выполните операцию обновления, чтобы получить минимальное и максимальное число в диапазоне.
Пример с реальными данными
Предположим, что я дал диапазон [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
Это простой пример. Фактическая проблема может содержать тысячи таких операций сложения/вычитания. Надеюсь, теперь это ясно.
Это то, что я понял до сих пор, но я думаю, что в Интернете нет единой ссылки, которая лучше объясняет концепцию и реализацию.
Может ли кто-нибудь дать хорошее объяснение, включая псевдокод для ленивого распространения в деревьях сегментов?
Спасибо.