只过了Hack其他全RE求助
查看原帖
只过了Hack其他全RE求助
573963
wbh20090611楼主2024/8/21 17:34
#include <bits/stdc++.h>
#define Pre true
#define Nxt false
using namespace std;
const int N = 100010;
int n, m, op, x;
namespace BST 
{
	struct node
	{
		node *lef, *rig;
		int val, siz;
	}*root, nn[N];
	int ans, l, cnt = -1;
	int le(node *r)
	{
		if (r->lef == NULL)
			return 0;
		return r->lef->siz;
	}
	void init(int x)
	{
		root = &nn[++cnt];
		root->siz = 1;
		root->val = x;
		root->rig = root->lef = NULL;
	}
	void insert(node *r, int x)
	{
		if (x > r->val)
		{
			if (r->rig == NULL)
			{
				node *rr = &nn[++cnt];
				r->rig = rr;
				rr->val = x;
				rr->siz = 1;
				rr->lef = rr->rig = NULL;
			}
			else
				insert(r->rig, x);
		}
		else
		{
			if (r->lef == NULL)
			{
				node *rr = &nn[++cnt];
				r->lef = rr;
				rr->val = x;
				rr->siz = 1;
				rr->lef = rr->rig = NULL;
			}
			else
				insert(r->lef, x);
		}
		r->siz = 1;
		if (r->lef != NULL)
			r->siz += r->lef->siz;
		if (r->rig != NULL)
			r->siz += r->rig->siz;
		return;
	}
	int query(node *r, int x, int &k)
	{
		if (r->siz == 1)
		{
			k++;
			return -INT_MAX;
		}
		if (le(r) + 1 + k < x)
		{
			k += 1 + le(r);
			int p = query(r->rig, x, k);
			if (k == x)
			{
				k++;
				return r->val;
			}
			return p;
		}
		else
		{
			int p = query(r->rig, x, k);
			if (k == x)
			{
				k++;
				return r->val;
			}
			return p;
		}
	}
	void pree(node *r, int x)
	{
		if (x > r->val)
		{
			if (r->rig != NULL)
				pree(r->rig, x);	
		}
		else
		{
			ans = min(r->val, ans);
			if (r->lef != NULL)
				pree(r->lef, x);
		}
	}
	void pre(node *r, int x)
	{
		if (x <= r->val)
		{
			if (r->lef != NULL)
				pre(r->lef, x);	
		}
		else
		{
			ans = max(r->val, ans);
			if (r->rig != NULL)
				pre(r->rig, x);
		}
	}
	void nxt(node *r, int x)
	{
		if (x >= r->val)
		{
			if (r->rig != NULL)
				nxt(r->rig, x);	
		}
		else
		{
			ans = min(r->val, ans);
			if (r->lef != NULL)
				nxt(r->lef, x);
		}
	}
	int rank(int x, bool t)
	{
		if (t == Pre)
		{
			ans = -INT_MAX;
			pre(root, x);
			return ans;
		}
		else
		{
			ans = INT_MAX;
			nxt(root, x);
			return ans;
		}
	}
	int qr(node *r, int x, int k = 0)
	{
		if (x == r->val)
			return k;
		else if (x < r->val)
		{
			if (r->lef != NULL)
				qr(r->lef, x, k);	
		}
		else
		{
			if (r->rig != NULL)
				qr(r->rig, x, k + 1 + le(r));
		}
	}
	int queryrank(int x)
	{
		ans = -INT_MAX;
		pree(root, x);
		return qr(root, ans) + 2;
	}
}
using namespace BST;
int main()
{
	cin >> m;
	int siz = 0;
	while(m--)
	{
		scanf("%d%d", &op, &x);
		switch(op)
		{
			case 1:
				{
					printf("%d\n", queryrank(x));
					break;
				}
			case 2:
				{
					int y = 0;
					printf("%d\n", query(root, x, y));
					break;
				}
			case 3:
				{
					printf("%d\n", BST::rank(x, Pre));
					break;
				}
			case 4:
				{
					printf("%d\n", BST::rank(x, Nxt));
					break;
				}
			default:
				{
					if (siz == 0)
					{
						siz++;
						init(x);
					}
					else
					{
						insert(root, x);
					}
					break;
				}
		}
	}
}
2024/8/21 17:34
加载中...