蒟蒻求助
查看原帖
蒟蒻求助
201007
Leasier楼主2021/10/4 17:07

RT,Splay 写挂了,已经调了一下午了 /kk

代码:

#include <stdio.h>

typedef struct {
	int father;
	int cur_cnt;
	int cnt;
	int val;
	int son[7];
} Node;

int cnt = 0, root;
Node tree[100007];

inline int get_son_type(int x){
	return tree[tree[x].father].son[0] == x ? 0 : 1;
}

inline void update(int x){
	tree[x].cnt = tree[tree[x].son[0]].cnt + tree[tree[x].son[1]].cnt + tree[x].cur_cnt;
}

inline void rotate(int x){
	int u = tree[x].father, v = tree[u].father, type = get_son_type(x), type_ = type ^ 1;
	tree[x].father = v;
	if (v == 0){
		root = x;
	} else {
		tree[v].son[get_son_type(u)] = x;
	}
	tree[u].son[type] = tree[x].son[type_];
	tree[tree[u].son[type]].father = u;
	tree[u].father = x;
	tree[x].son[type_] = u;
	update(u);
	update(x);
}

inline void splay(int x){
	while (tree[x].father != 0){
		int u = tree[x].father;
		if (tree[u].father != 0){
			if (get_son_type(x) != get_son_type(u)){
				rotate(x);
			} else {
				rotate(u);
			}
		}
		rotate(x);
	}
	root = x;
}

inline int insert(int x){
	if (root == 0){
		root = ++cnt;
		tree[cnt].cur_cnt = tree[cnt].cnt = 1;
		tree[cnt].val = x;
		return cnt;
	}
	int i = root;
	while (i != 0){
		tree[i].cnt++;
		if (x < tree[i].val){
			if (tree[i].son[0] != 0){
				i = tree[i].son[0];
			} else {
				tree[i].son[0] = ++cnt;
				break;
			}
		} else if (x == tree[i].val){
			tree[i].cur_cnt++;
			splay(i);
			return i;
		} else if (tree[i].son[1] != 0){
			i = tree[i].son[1];
		} else {
			tree[i].son[1] = ++cnt;
			break;
		}
	}
	tree[cnt].father = i;
	tree[cnt].cur_cnt = tree[cnt].cnt = 1;
	tree[cnt].val = x;
	splay(cnt);
	return cnt;
}

inline int find(int x){
	for (int i = root; i != 0; ){
		if (x == tree[i].val) return i;
		if (x < tree[i].val){
			i = tree[i].son[0];
		} else {
			i = tree[i].son[1];
		}
	}
	return 0;
}

inline int get_max(int x){
	while (tree[x].son[1] != 0) x = tree[x].son[1];
	return x;
}

inline void erase(int x){
	int u = find(x);
	if (u != 0){
		if (tree[u].cur_cnt == 1){
			int ls, rs;
			splay(u);
			ls = tree[u].son[0];
			rs = tree[u].son[1];
			tree[u].son[0] = tree[u].son[1] = tree[ls].father = tree[rs].father = 0;
			if (ls == 0){
				root = rs;
			} else {
				int v = get_max(ls);
				root = ls;
				splay(v);
				tree[v].father = 0;
				tree[v].son[1] = rs;
				tree[rs].father = v;
				update(v);
			}
		} else {
			tree[u].cur_cnt--;
			tree[u].cnt--;
		}
	}
}

inline int get_rank(int x){
	int ans = tree[tree[insert(x)].son[0]].cnt + 1;
	erase(x);
	return ans;
}

inline int get_kth_number(int x){
	if (x > tree[root].cnt) return -1;
	for (int i = root; i != 0; ){
		if (x <= tree[tree[i].son[0]].cnt){
			i = tree[i].son[0];
		} else {
			x -= tree[tree[i].son[0]].cnt + tree[i].cur_cnt;
			if (x <= 0) return tree[i].val;
			i = tree[i].son[1];
		}
	}
}

inline int get_prev(int x){
	int ans;
	ans = tree[get_max(tree[insert(x)].son[0])].val;
	erase(x);
	return ans;
}

inline int get_min(int x){
	while (tree[x].son[0] != 0) x = tree[x].son[0];
	return x;
}

inline int get_next(int x){
	int ans;
	ans = tree[get_min(tree[insert(x)].son[1])].val;
	erase(x);
	return ans;
}

int main(){
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++){
		int opt, x;
		scanf("%d %d", &opt, &x);
		if (opt == 1){
			insert(x);
		} else if (opt == 2){
			erase(x);
		} else if (opt == 3){
			printf("%d\n", get_rank(x));
		} else if (opt == 4){
			printf("%d\n", get_kth_number(x));
		} else if (opt == 5){
			printf("%d\n", get_prev(x));
		} else {
			printf("%d\n", get_next(x));
		}
	}
	return 0;
}
2021/10/4 17:07
加载中...