- Segment Tree
- BIT (Binary Indexed Tree)
- Treap
- Persistence Data Structure (Copy on write)
RMQ: Range Maximum/Minimum Query
https://domen-blog.github.io/posts/2015-08-20/hoj-144/
Build: O(N)
Modify(單點修改): O(lg N)
Query(區間查詢): O(lg N)
區間修改: O(lg N)
某種精簡版的線段樹(?)
100110
low bit: = 000010 (binary)
low bit of i
= i&-i
(-i 使用二的補數)
int bit[MAX_N+1];
int sum(int i)
{
int s=0;
while(i>0)
{
s+=bit[i];
i-=i&-i; //low bit
}
return s;
}
void add(int i,int v)
{
while(i<=n)
{
bit[i]+=v;
i+=i&-i;
}
}
- 二元搜尋樹 (Binary Search Tree)
- 二叉堆 (Binary Heap)
struture Treap {
Treap *l, *r;
int pri, key;
};
10行
Treap *merge(Treap *a, Treap *b) {
if (!a || !b) return a?a:b;
if (a->pri > b->pri) {
a->r = merge(a->r, b);
return a;
} else {
b->l = merge(a, b->l);
return b;
}
}
又是10行
void split(Treap *t, Treap *&a, Treap *&b, int k) {
if(!t) return a = b = nullptr;
else if (t->key <= k) {
a = t;
split(t->r, a->r, b, k);
} else {
b = t;
split(t->l, a, b->l, k);
}
}
code - TOJ 263.cpp
copy on write
Basic: HOJ 144 (壞了QQ), TIOJ 1603, POJ 3468(lazy flag), TIOJ 1871, HDU 1754, codeforces 52C
Advanced: ZJ a164, POJ 1823, TIOJ 1224, TOJ 242, TIOJ 1895, POJ 2155(二維), TIOJ 1887, TIOJ 1408, TIOJ 1161, TIOJ 1827, codechef QSET, codechef GCDQ
TOJ 11, TIOJ 1667, TIOJ 1272, TOJ 12, POJ 3067
Basic: TOJ 263, TIOJ 1305
Advanced: TOJ 242, TOJ 31, UVA 12538(持久化)
POJ 3580,3928,2352,2481,2029,3067,2777
HDU 1754,2795,1890,1394,1166
UVA 12538,11525,11992,12086,1406,11423,1232,11983,1400,12501,1513
TOJ 31