求助,可持久化01Trie调不出来
查看原帖
求助,可持久化01Trie调不出来
477443
vegetable_kingGallium楼主2021/12/4 14:02
#include <cstdio>
const long long move = 1e9 + 1;

int cnt, rt[500001], to[16000001][2], siz[16000001];
void insert(int f, int t, int x){
	x += move;
	int lu = rt[f], u = rt[t], lv, v, p;
	for (int b = 30;b >= 0;b --){
		siz[u] = siz[lu] + 1;
		p = (x >> b) & 1;
		lv = to[lu][p], v = to[u][p];
		if (!v) to[u][p] = v = ++ cnt;
		to[u][!p] = to[lu][!p];
		u = v, lu = lv;
	}
	siz[u] = siz[lu] + 1;
}
bool find(int f, int x){
	x += move;
	int u = rt[f], p;
	for (int b = 30;b >= 0;b --){
		p = (x >> b) & 1;
		if (!to[u][p]) return 0;
		u = to[u][p];
	}
	return 1;
}
void erase(int f, int t, int x){
	x += move;
	int lu = rt[f], u = rt[t], lv, v, p;
	for (int b = 30;b >= 0;b --){
		siz[u] = siz[lu] - 1;
		p = (x >> b) & 1;
		lv = to[lu][p], v = to[u][p];
		if (!v) to[u][p] = v = ++ cnt;
		to[u][!p] = to[lu][!p];
		u = v, lu = lv;
	}
	siz[u] = siz[lu] - 1;
}
int rank(int f, int x){
	x += move;
	int u = rt[f], p, ans = 1;
	for (int b = 30;b >= 0;b --){
		p = (x >> b) & 1;
		if (p) ans += siz[to[u][0]];
		u = to[u][p];
		if (!u) return ans;
	}
	return ans;
}
int kth(int f, int k){
	int u = rt[f], ans = 0;
	for (int b = 30;b >= 0;b --){
		if (siz[to[u][0]] < k) ans |= 1 << b, k -= siz[to[u][0]], u = to[u][1];
		else u = to[u][0];
	}
	return ans - move;
}
int pre(int f, int x){
	int ans = kth(f, rank(f, x) - 1);
	return (ans == -1000000001 ? -2147483647 : ans);
}
int nxt(int f, int x){
	int ans = kth(f, rank(f, x));
	return (ans == 1147483646 ? 2147483647 : ans);
}
int n, vi, op, x;
int main(){
	scanf("%d", &n);
	for (int i = 1;i <= n;i ++){
		scanf("%d%d%d", &vi, &op, &x);
		if (op > 2) rt[i] = rt[vi];
		if (op == 1) rt[i] = ++ cnt, insert(vi, i, x);
		if (op == 2 && find(vi, x)) rt[i] = ++ cnt, erase(vi, i, x);
		if (op == 3) printf("%d\n", rank(vi, x));
		if (op == 4) printf("%d\n", kth(vi, x));
		if (op == 5) printf("%d\n", pre(vi, x));
		if (op == 6) printf("%d\n", nxt(vi, x));
		if (op == 7) printf("%d\n", find(vi, x));
	}
}
2021/12/4 14:02
加载中...