求助fhqTreap
查看原帖
求助fhqTreap
448887
cancan123456楼主2022/2/20 19:28
#include <cstdio>
#include <random>
using namespace std;
const int N = 100005;
int rand() {
	static mt19937 engine(0);
	uniform_int_distribution < int > dist(-0x7fffffff - 1, 0x7fffffff);
	return dist(engine);
}
struct Node {
	int val, pri;
	int ch[2];
	int size;
} node[N];
int cnt, root = 0;
void pushup(int x) {
	node[x].size = node[node[x].ch[0]].size + node[node[x].ch[1]].size + 1;
}
void newnode(int x) {
	cnt++;
	node[cnt].val = x;
	node[cnt].pri = rand();
	node[cnt].size = 1;
}
int merge(int x, int y) {
	if (x == 0 || y == 0) {
		return x + y;
	} else {
		if (node[x].pri < node[y].pri) {
			node[x].ch[1] = merge(node[x].ch[1], y);
			pushup(x);
			return x;
		} else {
			node[y].ch[0] = merge(x, node[y].ch[0]);
			pushup(y);
			return y;
		}
	}
}
void split(int p, int v, int & x, int & y) {
	if (p == 0) {
		x = y = 0;
	} else {
		if (v <= node[p].val) {
			y = p;
			split(node[p].ch[0], v, x, node[p].ch[0]);
		} else {
			x = p;
			split(node[p].ch[1], v, node[p].ch[1], y);
		}
		pushup(p);
	}
}
int find_kth(int k) {
	int p = root;
	while (true) {
		if (k <= node[node[p].ch[0]].size) {
			p = node[p].ch[0];
		} else if (k == node[node[p].ch[0]].size + 1) {
			return node[p].val;
		} else {
			k -= node[node[p].ch[0]].size + 1;
			p = node[p].ch[1];
		}
	}
}
int find_max(int p) {
	while (node[p].ch[1] != 0) {
		p = node[p].ch[1];
	}
	return node[p].val;
}
int find_min(int p) {
	while (node[p].ch[0] != 0) {
		p = node[p].ch[0];
	}
	return node[p].val;
}
int main() {
	int n;
	scanf("%d", &n);
	int p1, p2, p3;
	for (int op, x, i = 1; i <= n; i++) {
		scanf("%d %d", &op, &x);
		if (op == 1) {
			split(root, x, p1, p2);
			newnode(x);
			root = merge(merge(p1, cnt), p2);
		} else if (op == 2) {
			split(root, x, p1, p2);
			split(p1, x - 1, p1, p3);
			p3 = merge(node[p3].ch[0], node[p3].ch[1]);
			root = merge(merge(p1, p3), p2);
		} else if (op == 3) {
			split(root, x - 1, p1, p2);
			printf("%d\n", node[p1].size + 1);
			root = merge(p1, p2);
		} else if (op == 4) {
			printf("%d\n", find_kth(x));
		} else if (op == 5) {
			split(root, x - 1, p1, p2);
			printf("%d\n", find_max(p1));
			root = merge(p1, p2);
		} else {
			split(root, x, p1, p2);
			printf("%d\n", find_min(p2));
			root = merge(p1, p2);
		}
	}
	return 0;
}
2022/2/20 19:28
加载中...