65pts求调【玄关】
查看原帖
65pts求调【玄关】
1115392
small_moon楼主2024/11/24 22:21
#include<bits/stdc++.h>
#define ls(x) t[(x)].son[0]
#define rs(x) t[(x)].son[1]
#define fa(x) t[(x)].fa
using namespace std;
const int N = 1e5 + 10;
int read();
struct Node {
	int v, fa, siz, cnt;
	int son[2];
}t[N];
int root, tot;
bool get(int k)
{
	return rs(fa(k)) == k;
}
void pushup(int k)
{
	t[k].siz = t[ls(k)].siz + t[rs(k)].siz + t[k].cnt;
}
int newnode(int x)
{
	t[++tot].v = x;
	t[tot].siz = t[tot].cnt = 1;
	return tot;
}
void rotate(int x)
{
	int y = fa(x), z = fa(y); int k = get(x);
	if (t[x].son[k ^ 1]) fa(t[x].son[k ^ 1]) = y;
	t[y].son[k] = t[x].son[k ^ 1];
	t[x].son[k ^ 1] = y; fa(y) = x; fa(x) = z;
	if (z) t[z].son[y == rs(z)] = x;
	pushup(y); pushup(x);
}
void splay(int x)
{
	for (int f = fa(x); f = fa(x); rotate(x))
		if (fa(f)) rotate(get(x) == get(f) ? f : x);
	root = x;
}
void insert(int x)
{
	int k = root, p = 0;
	while (k && t[k].v != x)
	{
		p = k;
		k = t[k].son[x > t[k].v];
	}
	if (k)
	{
		t[k].cnt++;
		return;
	}
	k = newnode(x); fa(k) = p; t[p].son[x > t[p].v] = k;
	splay(k);
}
void delet(int x)
{
	int k = root, p = 0;
	while (k && t[k].v != x)
	{
		p = k;
		k = t[k].son[x > t[k].v];
	}
	if (!k)
	{
		splay(p);
		return;
	}
	splay(k); int tmp = ls(k);
	if (t[k].cnt > 1)
	{
		t[k].cnt--; t[k].siz--;
		return;
	}
	if (!tmp)
	{
		root = rs(k);
		fa(rs(k)) = 0;
		t[k].siz = t[k].fa = t[k].v = t[k].son[0] = t[k].son[1] = t[k].cnt = 0;
		return;
	}
	while (rs(tmp)) tmp = rs(tmp);
	rs(tmp) = rs(k); fa(rs(k)) = tmp; fa(ls(k)) = 0;
	t[k].siz = t[k].fa = t[k].v = t[k].son[0] = t[k].son[1] = t[k].cnt = 0;
	pushup(tmp); splay(tmp);
}
int getrank(int x)
{
	int ret = 1, k = root, p = 0;
	while (k)
	{
		p = k;
		if (t[k].v < x) ret += t[ls(k)].siz + t[k].cnt, k = rs(k);
		else k = ls(k);
	}
	splay(p); return ret;
}
int xth(int x)
{
	int k = root;
	while (k)
	{
		int smin = t[ls(k)].siz + 1, smax = t[ls(k)].siz + t[k].cnt;
		if (smin > x) k = ls(k);
		else if (x >= smin && x <= smax) break;
		else x -= smax, k = rs(k);
	}
	splay(k); return t[k].v;
}
int getpre(int x)
{
	int k = root, ret = 0, p;
	while (k)
		if (p = k, t[k].v >= x) k = ls(k);
		else ret = t[k].v, k = rs(k);
	splay(p); return ret;
}
int getnxt(int x)
{
	int k = root, ret = 0, p;
	while (k)
		if (p = k, t[k].v <= x) k = rs(k);
		else ret = t[k].v, k = ls(k);
	splay(p); return ret;
}
int main()
{
	int T = read();
	while (T--)
	{
		int op = read(), x = read();
		if (op == 1) insert(x);
		if (op == 2) delet(x);
		if (op == 3) printf("%d\n", getrank(x));
		if (op == 4) printf("%d\n", xth(x));
		if (op == 5) printf("%d\n", getpre(x));
		if (op == 6) printf("%d\n", getnxt(x));
	}
	return 0;
}
int read()
{
	int x = 0, f = 1; char ch = getchar();
	while (ch < '0' || ch>'9')
	{
		if (ch == '-') f = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9')
	{
		x = (x << 1) + (x << 3) + (ch ^ 48);
		ch = getchar();
	}
	return x * f;
}
2024/11/24 22:21
加载中...