Treap 名次树

  1 struct treap_node {
  2     treap_node *left, *right;
  3     int value, fix, size;
  4 };
  5 
  6 void treap_maintain(treap_node* a) {
  7     a->size = 1;
  8     if(a->left != NULL) a->size += a->left->size;
  9     if(a->right != NULL) a->size += a->right->size;
 10 }
 11 
 12 void treap_left_rotate(treap_node *&a) {
 13     treap_node *b = a->right;
 14     a->right = b->left;
 15     b->left = a;
 16     a = b;
 17     treap_maintain(a->left);
 18     treap_maintain(a);
 19 }
 20 
 21 void treap_right_rotate(treap_node *&a) {
 22     treap_node *b = a->left;
 23     a->left = b->right;
 24     b->right = a;
 25     a = b;
 26     treap_maintain(a->right);
 27     treap_maintain(a);
 28 }
 29 
 30 void treap_insert(treap_node *&a, int value) {
 31     if(a == NULL) {
 32         a = new treap_node;
 33         a->value = value;
 34         a->fix = rand();
 35         a->left = a->right = NULL;
 36     } else if(value < a->value) {
 37         treap_insert(a->left, value);
 38         if(a->left->fix < a->fix) treap_right_rotate(a);
 39     } else {
 40         treap_insert(a->right, value);
 41         if(a->right->fix < a->fix) treap_left_rotate(a);
 42     }
 43     treap_maintain(a);
 44 }
 45 
 46 void treap_delete(treap_node *&a, int value) {
 47     if(value == a->value) {
 48         if(!a->left || !a->right) {
 49             treap_node *t = a;
 50             if(!a->left) a = a->right;
 51             else a = a->left;
 52             delete t;
 53         } else {
 54             if(a->left->fix < a->right->fix) {
 55                 treap_right_rotate(a);
 56                 treap_delete(a->right, value);
 57             } else {
 58                 treap_left_rotate(a);
 59                 treap_delete(a->left, value);
 60             }
 61         }
 62     } else {
 63         if(value < a->value) treap_delete(a->left, value);
 64         else treap_delete(a->right, value);
 65     }
 66     if(a != NULL) treap_maintain(a);
 67 }
 68 
 69 bool treap_find(treap_node* a, int value) {
 70     if(a == NULL) return 0;
 71     if(a->value == value) return 1;
 72     if(a->value < value) {
 73         return treap_find(a->right, value);
 74     } else {
 75         return treap_find(a->left, value);
 76     }
 77 }
 78 
 79 int treap_findKth(treap_node* a, int k) {
 80     if(a == NULL) return -1;
 81     if(k < 0 || k > a->size) return -1;
 82     if(a->left == NULL) {
 83         if(k == 1) return a->value;
 84         else return treap_findKth(a->right, k-1);
 85     }
 86     if(a->left->size == k-1) {
 87         return a->value;
 88     }
 89     if(a->left->size < k-1) {
 90         return treap_findKth(a->right, k-1 - a->left->size);
 91     } else {
 92         return treap_findKth(a->left, k);
 93     }
 94 }
 95 
 96 int treap_rank(treap_node* a, int value) {
 97     if(a == NULL) return -INF;
 98     if(a->value == value) {
 99         if(a->left == NULL) return 1;
100         return a->left->size + 1;
101     }
102     if(a->value < value) {
103         int cnt = 0;
104         if(a->left == NULL) cnt = 0;
105         else cnt = a->left->size;
106         return treap_rank(a->right, value) + cnt + 1;
107     } else {
108         return treap_rank(a->left, value);
109     }
110 }
posted @ 2015-03-27 23:08  Mite  阅读(165)  评论(0)    收藏  举报