求调fhq-Treap 本地运行失败(RTE or MLE)
  • 板块学术版
  • 楼主wtcqwq
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/12/10 17:44
  • 上次更新2023/10/26 23:54:11
查看原帖
求调fhq-Treap 本地运行失败(RTE or MLE)
241867
wtcqwq楼主2022/12/10 17:44
#include<bits/stdc++.h>
using namespace std;
typedef int ll;
const ll N = 100009;
#define mp(a,b) make_pair((a),(b))
class Treap {
	private:
		ll root, cnt;
		struct node {
			ll l, r, s, v, k;
			node();
			node(ll);
		} tr[N];
		pair<int, int> split(ll p, ll k);
		pair<int, int> splitvalue(ll p, ll v);
		ll find(ll p, ll v);
		ll merge(ll x, ll y);
		void pushup(ll p);
	public:
		ll kth(ll k);
		ll rank(ll v);
		void insert(ll v);
		void erase(ll v);
} tree;
Treap::node::node() {
	l = 0, r = 0, s = 0, v = 0, k = rand();
}
Treap::node::node(ll _v) {
	l = 0, r = 0, s = 0, v = _v, k = rand();
}
void Treap::pushup(ll p) {
	tr[p].s = tr[tr[p].l].s + tr[tr[p].r].s + 1;
}
pair<int, int> Treap::split(ll p, ll k) {
	if (!p) return mp(0, 0);
	if (k <= tr[tr[p].l].s) {
		auto o = split(tr[p].l, k);
		tr[p].l = o.second;
		pushup(p);
		o.second = p;
		return o;
	}
	auto o = split(tr[p].r, k);
	tr[p].r = o.first;
	pushup(p);
	o.first = p;
	return o;
}
pair<int, int> Treap::splitvalue(ll p, ll v) {
	if (!p) return make_pair(0, 0);
	if (v <= tr[p].v) {
		auto o = split(tr[p].l, v);
		tr[p].l = o.second;
		pushup(p);
		o.second = p;
		return o;
	}
	auto o = split(tr[p].r, v);
	tr[p].r = o.first;
	pushup(p);
	o.first = p;
	return o;
}
ll Treap::find(ll p, ll v) {
	if (tr[p].v == v) return v;
	if (tr[p].v > v) return find(tr[p].l, v);
	return find(tr[p].r, v);
}
ll Treap::merge(ll x, ll y) {
	if (!x) return y;
	if (!y) return x;
	if (tr[x].k > tr[y].k) {
		tr[x].r = merge(tr[x].r, y);
		pushup(x);
		return x;
	}
	tr[x].l = merge(tr[x].l, y);
	pushup(x);
	return x;
}
void Treap::erase(ll v) {
	auto o = splitvalue(root, v);
	auto t = o;
	if (find(o.second, v)) {
		t = split(o.second, 1);
	}
	root = merge(o.first, t.second);
}
void Treap::insert(ll v) {
	auto o = splitvalue(root, v);
	cnt++;
	tr[cnt] = node(v);
	o.first = merge(o.first, cnt);
	root = merge(root, o.first);
}
ll Treap::rank(ll v) {
	auto x = splitvalue(root, v);
	ll sz = tr[x.first].s;
	merge(x.first, x.second);
	return ++sz;
}
ll Treap::kth(ll k) {
	auto x = split(root, k - 1);
	auto y = split(x.second, 1);
	ll _v = tr[y.first].v;
	merge(x.first, merge(y.first, y.second));
	return _v;
}
int main() {
	srand(time(0));
	int t;
	scanf("%d", &t);
	while (t--) {
		ll mode;
		ll num;
		scanf("%d%d", &mode, &num);
		switch (mode) {
			case 1:
				tree.insert(num);
				break;
			case 2:
				tree.erase(num);
				break;
			case 3:
				printf("%d\n", tree.rank(num));
				break;
			case 4:
				printf("%d\n", tree.kth(num));
				break;
			case 5:
				printf("%d\n", tree.kth(tree.rank(num) - 1));
				break;
			case 6:
				printf("%d\n", tree.kth(tree.rank(num) + 1));
				break;
		}
	}
}
2022/12/10 17:44
加载中...