首页 > 代码库 > [平衡树学习笔记]那些你所不知道的鬼畜写法
[平衡树学习笔记]那些你所不知道的鬼畜写法
treap: (Orz fhq 大神,我曾经以为我会了 treap ,就再也不会写 splay 了,然后我遇上了 lct )
1 #include <cstdlib> 2 const int sizeOfMemory=10000; 3 template <class type> inline void swap(type & x, type & y) {type t=x; x=y; y=t;} 4 5 namespace treap 6 { 7 struct node 8 { 9 int key, size;10 short weight;11 bool rev;12 node * left, * right;13 inline node():size(1), weight(0) {left=right=this;}14 inline void maintain() {size=left->size+right->size+1;}15 inline void pushdown() {if (rev) swap(left, right), left->rev^=1, right->rev^=1, rev=0;}16 };17 node * null=new node();18 node memory[sizeOfMemory], * portOfMemory=memory;19 20 inline node * newnode(int key)21 {22 node * ret=portOfMemory++;23 ret->key=key; ret->size=1;24 ret->weight=rand();25 ret->rev=0;26 ret->left=ret->right=null;27 return ret;28 }29 void splitBySize(node * t, int k, node *& l, node *& r)30 {31 if (t==null) l=r=null;32 else33 {34 t->pushdown();35 if (t->left->size<k)36 {37 l=t;38 splitBySize(t->right, k-t->left->size-1, t->right, r);39 l->maintain();40 }41 else42 {43 r=t;44 splitBySize(t->left, k, l, t->left);45 r->maintain();46 }47 }48 }49 void splitByKey(node * t, int k, node *& l, node *& r)50 {51 if (t==null) l=r=null;52 else53 {54 t->pushdown();55 if (t->key<k)56 {57 l=t;58 splitByKey(t->right, k, t->right, r);59 l->maintain();60 }61 else62 {63 r=t;64 splitByKey(t->left, k, l, t->left);65 r->maintain();66 }67 }68 }69 node * merge(node * l, node * r)70 {71 if (l==null) return r;72 if (r==null) return l;73 if (l->weight>r->weight)74 {75 l->pushdown();76 l->right=merge(l->right, r);77 l->maintain();78 return l;79 }80 else81 {82 r->pushdown();83 r->left=merge(l, r->left);84 r->maintain();85 return r;86 }87 }88 }
splay: (我曾经以为我会了 treap ,就再也不会在 lct 外的地方写 splay 了,然后我遇上了 自顶向下 splay )
等待完坑
AVL: ( fhq 大神 说是为了解决人工实现 rope 时,treap 不能直接复制节点否则权重会痿掉的问题而搞出来的新产物,但 clj 大神似乎有更高明的做法)
等待完坑
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。