01trie写平衡树 WA #6#7#8#9#10 求助
#include <iostream>
#include <cstdio>
#define endl "\n"
using namespace std;
const int p = 1e7 + 9;
struct trie {
trie* child[2];
int cnt;
};
trie* create() {
trie* ret = (trie*)malloc(sizeof(trie));
ret->child[1] = 0, ret->child[0] = 0;
ret->cnt = 0;
return ret;
}
void insert(trie* root, int yf) {
trie* node = root;
int mx = 27;
bool lean;
while (~mx) {
(yf & (1 << mx)) ? lean = 1 : lean = 0;
if (node->child[lean] == NULL) {
node->child[lean] = create();
}
node = node->child[lean];
++node->cnt;
--mx;
}
return ;
}
void delate(trie* root, int yf) {
trie* node = root;
int mx = 27;
bool lean;
while (~mx) {
(yf & (1 << mx)) ? lean = 1 : lean = 0;
node = node->child[lean];
--node->cnt;
--mx;
}
return ;
}
int querys(trie* root, int yf) {
int ans = 0;
trie* node = root ;
int mx = 27;
bool lean;
while (~mx) {
(yf & (1 << mx)) ? lean = 1 : lean = 0;
if (lean) {
if (node->child[0] != NULL)
ans += node->child[0]->cnt;
if (node->child[1] != NULL)
node = node->child[1];
else
return ans;
} else {
if (node->child[0] != NULL)
node = node->child[0];
else
return ans;
}
--mx;
}
ans++;
return ans;
}
int search(trie* root, int yf) {
trie* node = root;
bool lean;
int ans = 0, df = yf, le, ri;
int mx = 27;
while (~mx) {
le = 0, ri = 0;
if (node->child[0] != NULL)
le = node->child[0]->cnt;
//cout << le << endl;
if (df <= le) {
node = node->child[0];
} else {
df -= le;
ans += (1 << mx);
node = node->child[1];
}
--mx;
}
return ans;
}
trie* rot;
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
rot = create();
int n, op, st;
cin >> n;
while (n--) {
cin >> op >> st;
if (op == 1)
insert(rot, st + p);
else if (op == 2)
delate(rot, st + p);
else if (op == 3)
cout << querys(rot, st + p) << endl;
else if (op == 4)
cout << search(rot, st) - p << endl;
else if (op == 5) {
int t = querys(rot, st + p);
cout << search(rot, t) - p << endl;
} else if (op == 6) {
int t = querys(rot, st + 1 + p);
cout << search(rot, t + 1) - p << endl;
}
}
return 0;
}