01trie 60分 浇浇
查看原帖
01trie 60分 浇浇
53141
芝麻馅儿汤圆楼主2022/8/29 17:27

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;
}

2022/8/29 17:27
加载中...