SBT模版

  1 /*Author:WNJXYK*/

  2 #include<cstdio>

  3 using namespace std;

  4 

  5 const int Maxn=10000;

  6 struct SBT{

  7     int left;

  8     int right;

  9     int size;

 10     int key;

 11 }; 

 12 SBT tree[Maxn+10];

 13 int root,cnt;

 14 

 15 inline void rotate_l(int &x){

 16     int y=tree[x].right;

 17     tree[x].right=tree[y].left;

 18     tree[y].left=x;

 19     tree[y].size=tree[x].size;

 20     tree[x].size=1+tree[tree[x].left].size+tree[tree[x].right].size;

 21     x=y;

 22 }

 23 

 24 inline void rotate_r(int &x){

 25     int y=tree[x].left;

 26     tree[x].left=tree[y].right;

 27     tree[y].right=x;

 28     tree[y].size=tree[x].size;

 29     tree[x].size=tree[tree[x].left].size+1+tree[tree[x].right].size;

 30     x=y; 

 31 }

 32 

 33 void maintain(int &x,bool flag){

 34     //printf("MainTain %d\n",x);

 35     if (flag==false){

 36         if (tree[tree[tree[x].left].left].size>tree[tree[x].right].size){

 37             rotate_r(x);

 38         }

 39         else if (tree[tree[tree[x].left].right].size>tree[tree[x].right].size){

 40             rotate_l(tree[x].left);

 41             rotate_r(x);

 42         }else return ;

 43     }else{

 44         if (tree[tree[tree[x].right].right].size>tree[tree[x].left].size){

 45             rotate_l(x);

 46         }else if (tree[tree[tree[x].right].left].size>tree[tree[x].left].size){

 47             rotate_r(tree[x].right);

 48             rotate_l(x);

 49         }else return ;

 50     }

 51     maintain(tree[x].left,false);

 52     maintain(tree[x].right,true);

 53     maintain(x,true);

 54     maintain(x,false);

 55 }

 56 void insert(int &x,int sp){

 57     if (!x){

 58         x=++cnt;

 59         tree[x].left=tree[x].right=0;

 60         tree[x].size=1;

 61         tree[x].key=sp;

 62     }else{

 63         tree[x].size++;

 64         if (sp<tree[x].key){

 65             insert(tree[x].left,sp);

 66         }else{

 67             insert(tree[x].right,sp);

 68         }

 69         maintain(x,sp>=tree[x].key);

 70     }

 71 }

 72 

 73 int del(int &x,int sp){

 74     tree[x].size--;

 75     if (sp==tree[x].key || ( sp<tree[x].key && tree[x].left==0) || (sp>tree[x].key && tree[x].right==0)){

 76         int y=tree[x].key;

 77         if (tree[x].left==0 ||tree[x].right==0){

 78             x=tree[x].left+tree[x].right;

 79             }else{

 80             tree[x].key=del(tree[x].left,tree[x].key+1);

 81         }

 82         return y;

 83     }else{

 84         if (sp<tree[x].key){

 85             return del(tree[x].left,sp);

 86         }else{

 87             return del(tree[x].right,sp);

 88         }

 89     }

 90 }

 91 

 92 inline int getMax(){

 93     int i;

 94     for (i=root;tree[i].right;i=tree[i].right);

 95     return tree[i].key;

 96 }

 97 

 98 inline int getMin(){

 99     int i;

100     for (i=root;tree[i].left;i=tree[i].left);

101     return tree[i].key;

102 }

103 

104 int rank(int &x,int sp){

105     if (sp<tree[x].key){

106         return rank(tree[x].left,sp);

107     }else if (sp>tree[x].key){

108         return rank(tree[x].right,sp)+tree[tree[x].left].size+1;

109     }

110     return tree[tree[x].left].size+1;

111 }

112 

113 int select(int &x,int rak){

114     int rk=tree[tree[x].left].size+1;

115     if (rak<rk){

116         return select(tree[x].left,rak);

117     }else if (rak>rk){

118         return select(tree[x].right,rak-rk);

119     }

120     return tree[x].key;

121 }

122 

123 int pred(int &x,int y,int sp){

124     if (x==0) return y;

125     if (tree[x].key<sp){

126         return pred(tree[x].right,x,sp);

127     }

128     return pred(tree[x].left,y,sp);

129 }

130 

131 int succ(int &x,int y,int sp){

132     if (x==0) return y;

133     if (tree[x].key>sp){

134         return succ(tree[x].left,x,sp);

135     }

136     return succ(tree[x].right,y,sp);

137 }

138 

139 inline void init(){

140     root=cnt=0;

141 }

142 

143 int main(){

144     init();

145     return 0;

146 }

 

你可能感兴趣的:(模版)