01trie求调
查看原帖
01trie求调
700717
why081023楼主2023/8/13 15:12
#include <bits/stdc++.h>
using namespace std;
int tot;
int a[2600005][2];
int s = 1e7;
int siz[2600005];

inline void insert(int val) {
	int now = 0;
	for (int i = 24; i >= 0; i--) {
		bool t = (1 << i)&val;
		if (!a[now][t])
			a[now][t] = ++tot;
		now = a[now][t];
		siz[now]++;
	}
}

inline void remove(int val) {
	int now = 0;
	for (int i = 24; i >= 0; i--) {
		bool t = (1 << i)&val;
		now = a[now][t];
		siz[now]--;
	}
}

inline int get_val(int rank) {
	int now = 0, ans = 0;
	for (int i = 24; i >= 0; i--) {
		bool t = siz[a[now][0]] < rank;
		if (t)
			rank -= siz[a[now][0]];
		ans += (1 << i) * t;
		now = a[now][t];
	}
	return ans;
}

inline int get_rank(int val) {
	int now = 0, ans = 0;
	for (int i = 24; i >= 0; i--) {
		bool t = (1 << i)&val;
		if (t)
			ans += siz[a[now][0]];
		if (!a[now][t])
			return ans + 1;
		now = a[now][t];
	}
	return ans + 1;
}
int n;

int main() {
	int now = 1;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		int opt, x;
		scanf("%d%d", &opt, &x);
		if (opt == 1)
			insert(x + s);
		else if (opt == 2)
			remove(x + s);
		else if (opt == 3)
			cout << get_rank(x + s) << endl;
		else if (opt == 4)
			cout << get_val(x) - s << endl;
		else if (opt == 5) {
			int hh = get_rank(x + s);
			cout << get_val(hh - 1) - s << endl;
		} else {
			int hh = get_rank(x + s);
			int hhh = get_val(hh) - s;
			//cout << hhh << endl;
			if (hhh > x)
				cout << hhh << endl;
			else
				cout << get_val(hh + 1) - s << endl;
		}
	}
}
2023/8/13 15:12
加载中...