悲伤的刷题经历
查看原帖
悲伤的刷题经历
389540
imfkwk楼主2021/3/3 00:47

刚刚过了平衡树的板子,来拿双倍经验,发现T了!!! 然后写了一个普通二叉搜索树的板子,又T了!!! 现在附上代码(

#include <bits/stdc++.h>
using namespace std;

void read(int& x)
{
	x = 0;
	int f = 1;

	char ch = getchar();
	while (ch < 48 || ch > 57)
	{
		if (ch == 45) f = -1;
		ch = getchar();
	}
	while (ch >= 48 && ch <= 57)
	{
		x = (x << 3) + (x << 1) + (ch ^ 48);
		ch = getchar();
	}

	x = x * f;
}

void write(int x)
{
	if (x < 0)
	{
		putchar(45);
		x = -x;
	}
	if (x > 9) write(x / 10);
	putchar(x % 10 + 48);
}

//////////////////////////////////////////////////

int lc[10001];
int rc[10001];
int val[10001];
int size[10001];
int cnt[10001];
int num;
int root;

void insert(int& o, int v)
{
	if (!o)
	{
		o = ++num;
		val[o] = v;
		size[o] = 1;
		cnt[o] = 1;
		return;
	}
	
	++size[o];
	if (val[o] == v)
	{
		++cnt[o];
		return;
	}
	
	if (v > val[o]) insert(rc[o], v);
	else if (v < val[o]) insert(lc[o], v);
}//insert

int deletmin(int&o)
{
	if (!lc[o])
	{
		int u = o;
		o = rc[o];
		return u;
	}
	else
	{
		int u = deletmin(lc[o]);
		size[o] -= cnt[u];
		return u;
	}
}
void delet(int& o, int v)
{
	--size[o];
	
	if (val[o] == v)
	{
		if (cnt[o] > 1)
		{
			--cnt[o];
			return;
		}
		
		if (lc[o] && rc[o]) o = deletmin(rc[o]);
		else o = rc[o] + lc[o];
		
		return;
	}
	
	if (v > val[o]) delet(rc[o], v);
	else if (v < val[o]) delet(lc[o], v);
}

int query_rank(int o, int v)
{
	if (val[o] == v) return size[lc[o]] + 1;
	if (val[o] > v) return query_rank(lc[o], v);
	if (val[o] < v) return size[lc[o]] + cnt[o] + query_rank(rc[o], v);
}//rank

int query_element(int o, int k)
{
	if (size[lc[o]] >= k) return query_element(lc[o], k);
	if (size[lc[o]] + cnt[o] < k) return query_element(rc[o], k - size[lc[o]] - cnt[o]);
	return val[o];
}//element

inline int query_front(int v)
{
	int rt = -2147483647;
	int o = root;
	while (o)
	{
		if (val[o] >= v) o = lc[o];
		else 
		{
			rt = max(rt, val[o]);
			o = rc[o];
		}
	}
	return rt;
}//front

inline int query_back(int v)
{
	int rt = 2147483647;
	int o = root;
	while (o)
	{
		if (val[o] <= v) o = rc[o];
		else 
		{
			rt = min(rt, val[o]);
			o = lc[o];
		}
	}
	return rt;
}//back

int n;

signed main(void)
{
	srand((int)time(NULL));
	read(n);
	
	while (n--)
	{
		int op, x;
		read(op); read(x);
		
		switch (op)
		{
			case 1: printf("%d\n", query_rank(root, x)); break;
			case 2: printf("%d\n", query_element(root, x)); break;
			case 3: printf("%d\n", query_front(x)); break;
			case 4: printf("%d\n", query_back(x)); break;
			case 5: insert(root, x); break;
		}
	}
	
	return 0;
}
2021/3/3 00:47
加载中...