Изменения

Перейти к: навигация, поиск
Псевдокод
==Псевдокод==
Используется классическая реализация дерева отрезка с полуинтервалами.
Нумерация массива с нуляПусть в узлах дерева хранятся структуры из трех полей:* <tex>left</tex> {{---}} левая граница полуинтервала, то есть корень дерева за который "отвечает" текущая вершина.* <tex>right</tex> {{---}} правая граница этого полуинтервала.* <tex> min</tex> {{---}} минимум на полуинтервале.* <tex> d</tex> {{---}} T[0]несогласованность.
  get_min(vint node, lint a, rint b) { // v node - текущая вершина, l a и r b - границы запроса l = tree[node].left; r = tree[node].right; if (отрезок соответствующий v не пересекается с [l, r])<tex>\bigcap </tex>[a, b) == <tex> \varnothing</tex> return inf /<tex>\infty</ бесконечность - нейтральный элемент относительно mintex>; if (отрезок соответствующий v содержится в [l, r]) == [a, b) return tree[vnode] .min + dtree[vnode].d; // Раздаем "проталкиваем" несогласованность детям d tree[2 * v node + 1] .d += dtree[2 * v + 1node] + .d[v]; d tree[2 * v node + 2] .d += dtree[2 * v + 2node] + .d; tree[vnode] .d[v] = 0; int m = (l + r) // Вызываем функцию от детей2; int ans = min(get_min(node * 2 * v + 1, la, min(b, rm)), get_min(node * 2 * v + 2, lmax(a, m), rb))); // Пересчитываем свое значение T tree[vnode] .min = min(T[2 * v + 1] + d[2 * v + 1], T[2 * v + 2] + d[2 * v + 2])ans; return ans;
}
333
правки

Навигация