Расширения декартова дерева: различия между версиями
Перейти к навигации
Перейти к поиску
Ctrlalt (обсуждение | вклад) (→Ссылки) |
Ctrlalt (обсуждение | вклад) Нет описания правки |
||
Строка 1: | Строка 1: | ||
== | struct TN { | ||
* | int v, p, c, maxV; | ||
TN *l, *r; | |||
TN(int V) : v(V), p(rand()), c(1), maxV(V), l(0), r(0) {} | |||
}; | |||
class ITreap { | |||
TN *root; | |||
int getMaxV(TN *n) { | |||
return n ? n->maxV : -(1 << 30); | |||
} | |||
int getC(TN *n) { | |||
return n ? n->c : 0; | |||
} | |||
void update(TN *n) { | |||
if (!n) | |||
return; | |||
n->c = 1 + getC(n->l) + getC(n->r); | |||
n->maxV = max(n->v, max(getMaxV(n->l), getMaxV(n->r))); | |||
} | |||
TN *merge(TN *a, TN *b) { | |||
if (!a || !b) | |||
return a ? a : b; | |||
if (a->p > b->p) { | |||
a->r = merge(a->r, b); | |||
update(a); | |||
return a; | |||
} else { | |||
b->l = merge(a, b->l); | |||
update(b); | |||
return b; | |||
} | |||
} | |||
void split(TN *t, int k, TN *&a, TN *&b) { | |||
if (!t) { | |||
a = b = 0; | |||
return; | |||
} | |||
if (getC(t->l) < k) { | |||
split(t->r, k - getC(t->l) - 1, t->r, b); | |||
a = t; | |||
} else { | |||
split(t->l, k, a, t->l); | |||
b = t; | |||
} | |||
update(a); | |||
update(b); | |||
} | |||
public: | |||
ITreap() : root(0) {} | |||
int size() { | |||
return getC(root); | |||
} | |||
void insert(int pos, int v) { | |||
TN *a, *b; | |||
split(root, pos, a, b); | |||
root = merge(a, merge(new TN(v), b)); | |||
} | |||
int getMax(int l, int r) { | |||
TN *a, *b, *c; | |||
split(root, l, a, b); | |||
split(b, r - l + 1, b, c); | |||
int res = getMaxV(b); | |||
root = merge(a, merge(b, c)); | |||
return res; | |||
} | |||
}; | |||
== Ссылки == | == Ссылки == | ||
Строка 6: | Строка 71: | ||
* [http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B5%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B2%D0%BE_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%BF%D0%BE_%D0%BD%D0%B5%D1%8F%D0%B2%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D0%BB%D1%8E%D1%87%D1%83 neerc.ifmo.ru/wiki — Декартово дерево по неявному ключу] | * [http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B5%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B2%D0%BE_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%BF%D0%BE_%D0%BD%D0%B5%D1%8F%D0%B2%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D0%BB%D1%8E%D1%87%D1%83 neerc.ifmo.ru/wiki — Декартово дерево по неявному ключу] | ||
* [http://habrahabr.ru/post/102364/ habrahabr.ru — Декартово дерево: Часть 3. Декартово дерево по неявному ключу] | * [http://habrahabr.ru/post/102364/ habrahabr.ru — Декартово дерево: Часть 3. Декартово дерево по неявному ключу] | ||
* [http:// | * [http://opentrains.mipt.ru/zksh/files/zksh2015/lectures/zksh_cartesian.pdf Иващенко Д., Семенов К. Декартово дерево] | ||
Код: | |||
* [http://github.com/indy256/codelibrary/blob/master/java/src/TreapImplicitKey.java CodeLibrary — Treap with implicit key with interval modification] | * [http://github.com/indy256/codelibrary/blob/master/java/src/TreapImplicitKey.java CodeLibrary — Treap with implicit key with interval modification] | ||
* [http://github.com/ADJA/algos/blob/master/DataStructures/CartesianTreeImplicitKeys.cpp Algos — Cartesian tree using implicit keys] | * [http://github.com/ADJA/algos/blob/master/DataStructures/CartesianTreeImplicitKeys.cpp Algos — Cartesian tree using implicit keys] | ||
Задачи: | |||
* [http://informatics.mccme.ru/course/view.php?id=18 informatics.mccme.ru — Курс «Структуры данных» — часть 4] | |||
* [[:Категория:Задачи: Декартово дерево по неявному ключу|Задачи: Декартово дерево по неявному ключу]] | |||
* [[:Категория:Задачи: Дерево Корнеева|Задачи: Дерево Корнеева]] | |||
[[Category:Балансирующиеся деревья]] | [[Category:Балансирующиеся деревья]] |
Версия от 00:17, 5 июля 2015
struct TN { int v, p, c, maxV; TN *l, *r; TN(int V) : v(V), p(rand()), c(1), maxV(V), l(0), r(0) {} }; class ITreap { TN *root; int getMaxV(TN *n) { return n ? n->maxV : -(1 << 30); } int getC(TN *n) { return n ? n->c : 0; } void update(TN *n) { if (!n) return; n->c = 1 + getC(n->l) + getC(n->r); n->maxV = max(n->v, max(getMaxV(n->l), getMaxV(n->r))); } TN *merge(TN *a, TN *b) { if (!a || !b) return a ? a : b; if (a->p > b->p) { a->r = merge(a->r, b); update(a); return a; } else { b->l = merge(a, b->l); update(b); return b; } } void split(TN *t, int k, TN *&a, TN *&b) { if (!t) { a = b = 0; return; } if (getC(t->l) < k) { split(t->r, k - getC(t->l) - 1, t->r, b); a = t; } else { split(t->l, k, a, t->l); b = t; } update(a); update(b); } public: ITreap() : root(0) {} int size() { return getC(root); } void insert(int pos, int v) { TN *a, *b; split(root, pos, a, b); root = merge(a, merge(new TN(v), b)); } int getMax(int l, int r) { TN *a, *b, *c; split(root, l, a, b); split(b, r - l + 1, b, c); int res = getMaxV(b); root = merge(a, merge(b, c)); return res; } };
Ссылки
- e-maxx.ru — Неявные декартовы деревья
- neerc.ifmo.ru/wiki — Декартово дерево по неявному ключу
- habrahabr.ru — Декартово дерево: Часть 3. Декартово дерево по неявному ключу
- Иващенко Д., Семенов К. Декартово дерево
Код:
- CodeLibrary — Treap with implicit key with interval modification
- Algos — Cartesian tree using implicit keys
Задачи: