全wa,求救
查看原帖
全wa,求救
619280
liuquhe楼主2022/2/19 23:07
#include<iostream>
using namespace std;
struct {
	int number;
	int left;
	int right;
	int numbersum;
	int treesum;

}tree[20002];
int sumsum;
inline void add(int x, int place = 0) {
	tree[place].treesum++;
	if (tree[place].number == x)
	{
		tree[place].numbersum++;
		return;
	}
	else if (x < tree[place].number)
	{
		if (tree[place].left != 0)
			add(x, tree[place].left);
		else
		{
			sumsum++;
			tree[place].left = sumsum;
			tree[sumsum].number = x;
			tree[sumsum].numbersum++;
			tree[sumsum].treesum++;

		}

	}
	else
	{
		if (tree[place].right != 0)
			add(x, tree[place].right);
		else {

			sumsum++;
			tree[place].right = sumsum;
			tree[sumsum].number = x;
			tree[sumsum].numbersum++;
			tree[sumsum].treesum++;
		}
	}
	tree[0].treesum = 0;
}
int smaller(int x, int xz = -2147483647, int place = 1) {
	if (tree[place].number >= x)
	{
		if (tree[place].left == 0)
			return xz;
		else
			return smaller(x, xz, tree[place].left);
	}
	else
	{
		xz = tree[place].number;
		if (tree[place].right == 0)
			return xz;
		else
			return smaller(x, xz, tree[place].right);

	}
}
int bigger(int x, int xz = 2147483647, int place = 1)
{
	if (tree[place].number > x)
	{
		xz = tree[place].number;
		if (tree[place].left != 0)
			return bigger(x, xz, tree[place].left);
		else
			return xz;

	}
	else
	{
		if (tree[place].right == 0)
			return xz;
		else
			return bigger(x, xz, tree[place].right);
	}
}
void print(int x)
{
	for (int j1 = 0; j1 < x; j1++)
	{
		cout << j1 << ":" << endl;
		cout << "number: " << tree[j1].number << endl;
		cout << "numbersum: " << tree[j1].numbersum << endl;
		cout << "treesum: " << tree[j1].treesum << endl;
	}
}
int ranking(int x, int place = 1)
{
	if (x == tree[place].number)
	{
		return 1 + tree[tree[place].left].treesum;
	}
	else if (x > tree[place].number)
	{
		if (tree[place].right != 0)
			return tree[place].numbersum + tree[tree[place].left].treesum + ranking(x, tree[place].right);
		else
			return tree[place].numbersum + tree[tree[place].left].treesum+1;
	}
	else
	{
		if (tree[place].left != 0)
			return ranking(x, tree[place].left);
		else return 1;

	}
}
int findnumber(int x, int place = 1)
{
	if (x > tree[tree[place].left].treesum && x <= (tree[tree[place].left].treesum + tree[place].numbersum))
	{
		return tree[place].number;
	}
	else if (x <= tree[tree[place].left].treesum)
	{
		return findnumber(x, tree[place].left);
	}
	else
	{
		return findnumber(x - tree[tree[place].left].treesum - tree[place].numbersum, tree[place].right);
	}
}
void tiaoshi()
{
	add(1);
	add(3);
	add(2);
	add(7);
	add(5);
	add(2);
	add(5);
	add(8);
	print(7);
}
int main(void) {
	int x;
	cin >> x;
	int j1 = 0;
	int l1, l2;
	for (j1 = 0; j1 < x; j1++)
	{
		cin >> l1 >> l2;
		if (l1 == 1)
		{
			
			cout << ranking(l2) << endl;
		}
		if (l1 == 2)
		{
			if (l2 > sumsum||l2==0)
				cout << "2147483647";
			else
				cout << findnumber(l2) << endl;


		}
		if (l1 == 3)
			cout << smaller(l2) << endl;
		if (l1 == 4)
			cout << bigger(l2) << endl;
		if (l1 == 5)
			add(l2);
	}


}

2022/2/19 23:07
加载中...