Реализация запроса в дереве отрезков сверху — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Реализация)
(Реализация)
Строка 5: Строка 5:
  
 
==Реализация==
 
==Реализация==
int sum (int v, int tl, int tr, int l, int r) {
+
<code>
if (l > r)
+
 
return 0;
+
  int sum (int v, int tl, int tr, int l, int r)
if (l == tl && r == tr)
+
  {
return t[v];
+
        if (l > r)
int tm = (tl + tr) / 2;
+
            return 0;
return sum (v*2, tl, tm, l, min(r,tm))
+
        if (l == tl && r == tr)
+ sum (v*2+1, tm+1, tr, max(l,tm+1), r);
+
            return t[v];
}
+
        int tm = (tl + tr) / 2;
 +
        return sum (v*2, tl, tm, l, min(r,tm))
 +
            + sum (v*2+1, tm+1, tr, max(l,tm+1), r);
 +
  }  
 +
</code>
  
 
==Ссылки==
 
==Ссылки==

Версия 01:18, 4 мая 2011

Определение:
Дерево отрезков — это структура данных, которая позволяет за асимптотику [math]O(\log n)[/math] реализовать операции следующего вида: нахождение суммы (задача RSQ), минимума или максимума (задача RMQ) элементов массива в заданном отрезке ([math]a[i...j][/math], где [math]i[/math] и [math]j[/math] поступают на вход алгоритма).

При этом дополнительно возможно изменение элементов массива: как изменение значения одного элемента, так и изменение элементов на целом подотрезке массива, т.е. разрешается присвоить всем элементам [math]a[i...j][/math] какое-либо значение, либо прибавить ко всем элементам массива какое-либо число. Структура занимает [math]O(n)[/math] памяти и выстраивается из массива за [math]O(n)[/math].

Алгоритм

Реализация

 int sum (int v, int tl, int tr, int l, int r)
 {
       if (l > r)
           return 0;
       if (l == tl && r == tr)
           return t[v];
       int tm = (tl + tr) / 2;
       return sum (v*2, tl, tm, l, min(r,tm))
           + sum (v*2+1, tm+1, tr, max(l,tm+1), r);
 } 

Ссылки

- MAXimal :: algo :: Дерево отрезков

- Дерево отрезков — Википедия