splay插入了极小极大值,但只有8分
查看原帖
splay插入了极小极大值,但只有8分
326254
LonginusMonkey楼主2023/8/2 09:35

用了文艺平衡树的板子

#include<bits/stdc++.h>
#define int long long
#define inf 1e9
using namespace std;
const int N=100010+10;
struct node{
	int s[2], v, p; int size, flag;
	void init(int _v, int _p) {v = _v;p = _p;size=1;}
}tree[N];
int root, idx;
int ws(int index) {
	return tree[tree[index].p].s[1] == index;
}
void setson(int son, int father, int which) {
	if(father)tree[father].s[which] = son;
	if(son)tree[son].p = father;
}
void push_up(int index) {
	tree[index].size = tree[tree[index].s[0]].size + tree[tree[index].s[1]].size;
}
void rotate(int index) {
	int f = tree[index].p, ff = tree[f].p, w = ws(index), wf = ws(f), p = tree[index].s[!w];
	setson(p, f, w); setson(index, ff, wf); setson(f, index, !w);
	push_up(f);push_up(index);
}
void splay(int index, int x = 0) {
	while(tree[index].p != x) {
		int f = tree[index].p, ff = tree[f].p;
		if(ff != x) {
			if(ws(index) != ws(f)) {rotate(index);}
			else; rotate(f);
		}
		rotate(index);
	}
	if(!x) root = index;
}
void insert(int v) {
	int u = root, p = 0;
	while(u) {
		p = u;
		u = tree[u].s[v>tree[u].v];
	}
	u = ++ idx;
	if(p) tree[p].s[v>tree[u].v] = u;
	tree[u].init(v, p); splay(u);
}
void del(int v) {
	int u = root, p = 0, ans;
	while(u) {
		p = u;
		if(tree[u].v < v) {
			u = tree[u].s[0];
		} else {
			u = tree[u].s[1];
		}
	}
	int pp = tree[p].p;
	if(tree[p].v == v) {
		tree[pp].s[ws(p)] = 0;
	}
}
int que1(int v) {
	int ans = 1,u = root, p = 0;
	while(u) {
		p = u;
		if(v > tree[u].v) ans = ans+1+tree[tree[u].s[0]].size;
		u = tree[u].s[v>tree[u].v];
	}
	int pp = tree[p].p;
	tree[pp].s[ws(p)] = 0;
	splay(pp);
	return ans;
}
int que2(int v) {
	int ans, u = root, p = 0;
	while(u) {
		p = u;
		if(tree[u].size>=v) {
			u = tree[u].s[0];
		} else if(tree[u].size+1==v) {
			int ans = tree[u].v;
			return ans;
		} else {
			v = v - tree[u].size - 1;
			u = tree[u].s[1];
		}
	}
}
int que3(int v) {
	int u = root, p = 0, ans = -1;
	while(u) {
		p = u;
		if(tree[u].v < v) {
			ans = tree[u].v;
			u = tree[u].s[1];
		} else {
			u = tree[u].s[0];
		}
	}
	return ans;
}
int que4(int v) {
	int u = root, p = 0, ans = -1;
	while(u) {
		p = u;
		if(tree[u].v > v) {
			ans = tree[u].v;
			u = tree[u].s[0];
		} else {
			u = tree[u].s[1];
		}
	}
	return ans;
}
signed main() {
	ios::sync_with_stdio(0); cin.tie(0);
	int t; cin >> t;
	insert(-inf); insert(inf);
	while(t--) {
		int opt, x; cin >> opt >> x;
		if(opt == 1) insert(x);
		else if(opt == 2) del(x);
		else if(opt == 3) cout << que1(x)-1 << endl;
		else if(opt == 4) cout << que2(x) << endl;
		else if(opt == 5) cout << que3(x) << endl;
		else if(opt == 6) cout << que4(x) << endl;
	}
	return 0;
}
2023/8/2 09:35
加载中...