Treap模板

  1 /*************************************************************************

  2     > File Name: D.cpp

  3     > Author: Stomach_ache

  4     > Mail: [email protected]

  5     > Created Time: 2014年10月03日 星期五 14时55分53秒

  6     > Propose: 

  7  ************************************************************************/

  8 #include <cmath>

  9 #include <ctime>

 10 #include <string>

 11 #include <cstdio>

 12 #include <vector>

 13 #include <fstream>

 14 #include <cstring>

 15 #include <iostream>

 16 #include <algorithm>

 17 using namespace std;

 18 /*Let's fight!!!*/

 19 

 20 typedef struct TreeNode* pTree;

 21 pTree null, root;

 22 struct TreeNode {

 23     int value, size, prior;

 24     //======

 25     int ans, Lval, Rval;

 26     //======

 27     pTree lch, rch;

 28     TreeNode() : value(0), size(0) {

 29           lch = rch = NULL;

 30     }

 31     TreeNode(int val);

 32 };

 33 

 34 TreeNode::TreeNode(int val) : value(val), size(1) {

 35     lch = rch = NULL;

 36     prior = rand() % 1000000000 + 1;

 37     Lval = Rval = val;

 38     ans = 1;

 39 }

 40 

 41 int GetRightValue(pTree t) {

 42f (!t->rch) return t->value;

 43     return GetRightValue(t->rch);

 44 }

 45 

 46 int GetLeftValue(pTree t) {

 47     if (!t->lch) return t->value;

 48     return GetLeftValue(t->lch);

 49 }

 50 

 51 int GetSize(pTree t) {

 52       if (!t) return 0;

 53       return t->size;

 54 }

 55 

 56 int GetAns(pTree t) {

 57     if (!t) return 0;

 58     return t->ans;

 59 }

 60 

 61 void pushUp(pTree t) {

 62     if (!t) return ;

 63     t->size = 1 + GetSize(t->lch) + GetSize(t->rch);

 64     if (t->lch) 

 65         t->Lval = t->lch->Lval;

 66     else 

 67         t->Lval = t->value;

 68     if (t->rch)

 69           t->Rval = t->rch->Rval;

 70     else 

 71           t->Rval = t->value;

 72 

 73     t->ans = 1 + GetAns(t->lch) + GetAns(t->rch);

 74     if (t->lch && t->value == t->lch->Rval) t->ans--;

 75     if (t->rch && t->value == t->rch->Lval) t->ans--;

 76 }

 77 

 78 void Split(pTree t, pTree &l, pTree &r, int key, int add = 0) {

 79     if (!t) {

 80         l = r = NULL;

 81         return ;

 82     }

 83 

 84     int cur_add = add + GetSize(t->lch);

 85     if (cur_add >= key) Split(t->lch, l, t->lch, key, add), r = t;

 86     else Split(t->rch, t->rch, r, key, add + GetSize(t->lch) + 1), l = t;

 87     pushUp(l);

 88     pushUp(r);

 89 }

 90 

 91 void Merge(pTree &t, pTree l, pTree r) {

 92       // Merge two subtree

 93     pushUp(l);

 94     pushUp(r);

 95     if (!l|| !r) {

 96           t = l ? l : r;

 97         return ;

 98     }

 99 

100     if (l->prior > r->prior) Merge(l->rch, l->rch, r), t = l;

101     else Merge(r->lch, l, r->lch), t = r;

102     pushUp(t);

103 }

104 

105 void insert(pTree &t, int val) {

106     pTree tmp = new TreeNode(val);

107     Merge(t, t, tmp);

108 }

109 

110 void write(pTree t) {

111       if (!t) return ;

112     write(t->lch);

113     cout << t->value << " ";

114     write(t->rch);

115 }

116 

117 int get(pTree root, int l, int r) {

118       pTree t1, t2, t3;

119     // spliting tree in three segments t1, t2, t3;

120     Split(root, t1, t3, r);

121     Split(t1, t1, t2, l - 1);

122     // t2 = segment from l to r

123     int ret = t2->ans;

124     // get back to start position

125     Merge(t1, t1, t2);

126     Merge(root, t1, t3);

127     return ret;

128 }

129 

130 void replacing(pTree &root, int l, int r) {

131       pTree t1, t2, t3;

132     // spliting tree in three segments t1, t2, t3

133     Split(root, t1, t3, r);

134     Split(t1, t1, t2, l - 1);

135     // merging them in this order: t2, t1, t3

136     Merge(t1, t2, t1);

137     Merge(root, t1, t3);

138 }

139 

140 void read(int &res) {

141     res = 0;

142     char c = ' ';

143     while (c < '0' || c > '9') c = getchar();

144     while (c >= '0' && c <= '9') res = (res<<3) + (res<<1) + c - '0', c = getchar();

145 }

146 

147 int main(void) {

148       srand(time(0));

149     //null = new TreeNode();

150     //null->lch = null->rch = null;

151     //null->size = null->value = 0;

152 

153     ios::sync_with_stdio(false);

154     int tcase;

155     read(tcase);

156     while (tcase--) {

157           root = NULL;

158           int N, M, val, op, l, r;

159         read(N);

160         for (int i = 1; i <= N; i++) {

161               read(val);

162             insert(root, val);

163         }

164         read(M);

165         while (M--) {

166               read(op), read(l), read(r);

167             if (op == 1) {

168                   int res = get(root, l, r);

169                 cout << res << endl;

170             } else {

171                   replacing(root, l, r);

172             }

173         }

174     }

175 

176     return 0;

177 }

 

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