treap WA 求助
查看原帖
treap WA 求助
332914
happybob楼主2022/5/11 09:45
#include <iostream>
#include <cmath>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <unordered_map>
using namespace std;

#define int long long

const int N = 1e4 + 5, INF = INT_MAX, MINF = INT_MIN + 1;

unordered_map<int, bool> p;

int n, idx, root;

class Treap
{
public:
	struct Node
	{
		int l, r, val, cnt, sz, key;
	}tr[N];
	int get_node(int key)
	{
		tr[++idx].key = key;
		tr[idx].sz = tr[idx].cnt = 1;
		tr[idx].val = rand();
		return idx;
	}
	void pushup(int u)
	{
		tr[u].sz = tr[tr[u].l].sz + tr[tr[u].r].sz + tr[u].cnt;
	}
	void zig(int& x)
	{
		int q = tr[x].l;
		tr[x].l = tr[q].r, tr[q].r = x, x = q;
		pushup(tr[x].r), pushup(x);
	}
	void zag(int& x)
	{
		int q = tr[x].r;
		tr[x].r = tr[q].l, tr[q].l = x, x = q;
		pushup(tr[x].l), pushup(x);
	}
	void build()
	{
		get_node(MINF), get_node(INF);
		root = 1, tr[1].r = 2;
		pushup(root);
		if (tr[1].val < tr[2].val) zag(root);
	}
	void insert(int& x, int key)
	{
		if (!x) x = get_node(key);
		else if (tr[x].key == key) tr[x].cnt++;
		else if (tr[x].key > key)
		{
			insert(tr[x].l, key);
			if (tr[tr[x].l].val > tr[x].val) zig(x);
		}
		else
		{
			insert(tr[x].r, key);
			if (tr[tr[x].r].val > tr[x].val) zag(x);
		}
		pushup(x);
	}
	int get_key(int p, int rank)
	{
		if (!p) return INF;
		if (tr[tr[p].l].sz >= rank) return get_key(tr[p].l, rank);
		if (tr[tr[p].l].sz + tr[p].cnt >= rank) return tr[p].key;
		return get_key(tr[p].r, rank - tr[tr[p].l].sz - tr[p].cnt);
	}
	int get_rank(int x, int key)
	{
		if (!x) return 0;
		if (tr[x].key == key) return tr[tr[x].l].sz + 1;
		if (tr[x].key > key) return get_rank(tr[x].l, key);
		return tr[tr[x].l].sz + tr[x].cnt + get_rank(tr[x].r, key);
	}
	int get_prev(int x, int key)
	{
		if (!x) return MINF;
		if (tr[x].key >= key) return get_prev(tr[x].l, key);
		return max(tr[x].key, get_prev(tr[x].r, key));
	}
	int get_next(int x, int key)
	{
		if (!x) return INF;
		if (tr[x].key <= key) return get_next(tr[x].r, key);
		return min(tr[x].key, get_next(tr[x].r, key));
	}
	void del(int& x, int key)
	{
		if (!x) return;
		if (tr[x].key == key)
		{
			if (tr[x].cnt > 1) tr[x].cnt--;
			else if (tr[x].l || tr[x].r)
			{
				if (!tr[x].r || tr[tr[x].l].val > tr[tr[x].r].val)
				{
					zig(x);
					del(tr[x].r, key);
				}
				else
				{
					zag(x), del(tr[x].l, key);
				}
			}
			else tr[x].cnt--, tr[x].sz--, x = 0;
		}
		else if (tr[x].key > key) del(tr[x].l, key);
		else del(tr[x].r, key);
		pushup(x);
	}
};

Treap tp;

signed main()
{
	int cnt = 0;
	tp.build();
	scanf("%lld", &n);
	while (n--)
	{
		int op, x;
		scanf("%lld%lld", &op, &x);
		if (op == 1)
		{
			tp.insert(root, x);
			printf("%lld\n", tp.get_rank(root, x) - 1);
			tp.del(root, x);
		}
		else if (op == 2)
		{
			if (x > cnt) printf("%lld\n", INF);
			else printf("%lld\n", tp.get_key(root, x + 1));
		}
		else if (op == 3)
		{
			tp.insert(root, x);
			printf("%lld\n", tp.get_prev(root, x));
			tp.del(root, x);
		}
		else if (op == 4) tp.insert(root, x), printf("%lld\n", tp.get_next(root, x)), tp.del(root, x);
		else tp.insert(root, x), cnt++, p[x] = true;
	}
	return 0;
}
2022/5/11 09:45
加载中...