treap-名次树-树堆
#include <cstring> #include <cstdio> #include <cstdlib> using namespace std; struct Node{ Node *ch[2]; int rank , value , size; const static int mod = 100; Node(int x){ value = x; rank = rand(); ch[1] = ch[0] = NULL; size = 0; } bool operator < (int & rht) const{ return value < rht; } bool operator == (int & rht) const{ return value == rht; } }; class Treap{ private: static int insert(Node * &o,int x); static void rotate(Node * &o,int d); static int remove(Node * &o, int x); static int find(Node * &o, int x); static void show(Node * o); static void destory(Node * &o); public: Node * root ; Treap(){ root = NULL; } ~Treap(){ Treap :: destory(root); } int insert(int x){ return Treap :: insert(root,x); } int remove(int x){ return Treap :: remove(root,x); } int find(int x){ return Treap :: find(root,x); } void show(){ Treap :: show(root); }; }; int Treap :: insert(Node * &o , int x){ if(o == NULL){ o = new Node(x); return 1; } if(o -> value == x) { (o -> size) ++; return o -> size; } int guide = ( *o < x ) ? 1 : 0 ; Treap ::insert(o-> ch[guide], x); if(o->ch[guide] -> rank > o -> rank ) { Treap::rotate(o,guide^1); } } int Treap :: remove(Node * &o , int x){ if( o == NULL ) return 0; if(o -> value == x){ ( o -> size ) -- ; if( o -> size != 0) return 1; // 需要删除 Node * del = o; if(o->ch[0] && o->ch[1]){ int tmp = o->ch[0] -> rank < o->ch[1] -> rank ? 0 : 1; Treap :: rotate( o , tmp); return Treap :: remove(o->ch[tmp],x); }else{ // 即使没有儿子节点也无所谓,因为会吧NULL配上; if( o-> ch[0] ) o = o -> ch[0]; else o = o -> ch[1]; delete del; return 1; } } int guide = ( *o < x )? 1 : 0 ; Treap :: remove(o->ch[guide], x); } int Treap :: find(Node * &o , int x){ if( o == NULL ) return 0; if( o -> value == x) return o -> size; int guide = ( *o < x )? 1 : 0; return Treap :: find(o->ch[guide] , x); } void Treap :: rotate(Node * &o , int d){ Node * tmp = o -> ch[d^1]; o -> ch[d^1] = tmp -> ch[d]; tmp -> ch[d] = o; o = tmp; } void Treap :: show(Node * o){ if( o == NULL ) return; printf("("); show(o->ch[0]); printf("%d/%d",o -> value, o->rank); show(o->ch[1]); printf(")"); } void Treap :: destory(Node * & o){ if( o == NULL) return; if( o-> ch[0]) Treap :: destory(o->ch[0]); if( o-> ch[1]) Treap :: destory(o->ch[1]); delete o; o = NULL; } int main(){}