码风良好,0pts,splay求调
查看原帖
码风良好,0pts,splay求调
1266620
duxingpeng楼主2025/2/5 19:51
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x7ffffff
#define rep(i,s,t) for(register ll i = s;i <= t;++i)
#define per(i,t,s) for(register ll i = t;i >= s;--i)
struct splay_tree
{
	ll f;
	ll cnt;
	ll siz;
	ll val;
	ll s[2];
};
ll n;
ll rt;
ll cnt;
splay_tree t[1000005];
inline ll read()
{
	ll x = 0;
	ll y = 1;
	char c = getchar();
	while(c < '0' || c > '9')
	{
		if(c == '-')
			y = -y;
		c = getchar();
	}
	while(c >= '0' && c <= '9')
	{
		x = (x << 3) + (x << 1) + (c - '0');
		c = getchar();
	}
	return x * y;
}
inline void write(ll x)
{
	if(x < 0)
	{
		putchar('-');
		write(llabs(x));
		return;
	}
	if(x > 9)
		write(x / 10);
	putchar(x % 10 + '0');
}
inline void push_up(ll p)
{
	t[p].siz = t[t[p].s[0]].siz + t[t[p].s[1]].siz + t[p].cnt;
}
inline void rotate(ll p)
{
	ll x = t[p].f;
	ll y = t[x].f;
	ll k = (t[x].s[1] == p);
	t[y].s[t[y].s[1] == x] = p;
	t[p].f = y;
	t[x].s[k] = t[p].s[k ^ 1];
	t[t[p].s[k ^ 1]].f = x;
	t[p].s[k ^ 1] = x;
	t[y].f = p;
	push_up(x);
	push_up(p);
}
inline void splay(ll p,ll k)
{
	while(t[p].f != k)
	{
		ll x = t[p].f;
		ll y = t[x].f;
		if(y != k)
		{
			if((t[x].s[1] == p) ^ (t[y].s[1] == x))
				rotate(p);
			else
				rotate(x);
		}
		rotate(p);
	}
	if(!k)
		rt = p;
}
inline void insert(ll k)
{
	ll x = rt;
	ll y = 0;
	while(x && t[x].val != k)
	{
		y = x;
		x = t[x].s[k > t[x].val];
	}
	if(x)
		t[x].cnt++;
	else
	{
		x = ++cnt;
		if(y)
			t[y].s[k > t[y].val] = x;
		t[x].cnt = 1;
		t[x].siz = 1;
		t[x].val = k;
		t[x].f = y;
	}
	splay(x,0);
}
inline void up(ll k)
{
	ll x = rt;
	while(t[x].s[k > t[x].val] && t[x].val != k)
		x = t[x].s[k > t[x].val];
	splay(x,0);
}
inline ll rnk(ll k)
{
	up(k);
	return t[t[rt].s[0]].siz + 1;
}
inline ll kth(ll k)
{
	ll x = rt;
	while(t[x].siz >= k)
	{
		if(t[t[x].s[0]].siz >= k)
			x = t[x].s[0];
		else if(t[t[x].s[0]].siz + t[x].cnt >= k)
		{
			splay(x,0);
			return t[x].val;
		}
		else
		{
			k -= t[t[x].s[0]].siz + t[x].cnt;
			x = t[x].s[1];
		}
	}
	return -1;
}
inline ll pre(ll k)
{
	up(k);
	if(t[rt].val < k)
		return rt;
	ll x = t[rt].s[0];
	while(t[x].s[1])
		x = t[x].s[1];
	return x;
}
inline ll suf(ll k)
{
	up(k);
	if(t[rt].val > k)
		return rt;
	ll x = t[rt].s[1];
	while(t[x].s[0])
		x = t[x].s[0];
	return x;
}
inline void del(ll k)
{
	ll p = pre(k);
	ll s = suf(k);
	splay(p,0);
	splay(s,p);
	ll x = t[s].s[0];
	if(t[x].cnt > 1)
	{
		t[x].cnt--;
		splay(x,0);
	}
	else
	{
		t[s].s[0] = 0;
		splay(s,0);
	}
}
int main()
{
	insert(INF);
	insert(-INF);
	n = read();
	rep(i,1,n)
	{
		ll opt = 0;
		ll tmp = 0;
		opt = read();
		tmp = read();
		if(opt == 1)
			insert(tmp);
		else if(opt == 2)
			del(tmp);
		else if(opt == 3)
		{
			write(rnk(tmp) - 1);
			putchar('\n');
		}
		else if(opt == 4)
		{
			write(kth(tmp + 1));
			putchar('\n');
		}
		else if(opt == 5)
		{
			write(t[pre(tmp)].val);
			putchar('\n');
		}
		else if(opt == 6)
		{
			write(t[suf(tmp)].val);
			putchar('\n');
		}
	}
	return 0;
}
2025/2/5 19:51
加载中...