数据结构-二叉搜索树BTS(洛谷 P5076 【深基16.例7】普通二叉树(简化版))

#include <cstring>
#include <string.h>
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <queue>
#define ll long long
#define PII pair<int, int>
#define PSI pair<string, int>
#define MSI map<string,int>
#define TLE ios::sync_with_stdio(0),cin.tie(0)
#define mod 1000000007
const int INF = 0x7fffffff;
using namespace std;
struct Node {
	int rs, ls, siz, val, cnt;
}node[500010];
int Tail = 0;
void Add(int idx,int val ) {
	node[idx].siz++;
	if (node[idx].val == val) {
		node[idx].cnt++; return;
	}
	if (node[idx].val > val) {
		if (node[idx].ls) Add(node[idx].ls, val);
		else {
			Tail++;
			node[Tail].cnt = node[Tail].siz = 1;
			node[Tail].val = val;
			node[idx].ls = Tail;
		}
	}
	else {
		if (node[idx].rs) Add(node[idx].rs, val);
		else {
			Tail++;
			node[Tail].cnt = node[Tail].siz = 1;
			node[Tail].val = val;
			node[idx].rs = Tail;
		}
	}
}
int ValToPos(int idx,int val) {
	if (!idx) return 0;
	if (val == node[idx].val) return node[node[idx].ls].siz + 1;
	else if (val > node[idx].val)
		return ValToPos(node[idx].rs, val) + node[node[idx].ls].siz + node[idx].cnt;
	else if (val < node[idx].val) return ValToPos(node[idx].ls, val);
}
int PosToVal(int idx, int pos) {
	if (!idx) return INF;
	if (node[node[idx].ls].siz >= pos) return PosToVal(node[idx].ls, pos);
	else if (node[node[idx].ls].siz + node[idx].cnt >= pos) return node[idx].val;
	else return PosToVal(node[idx].rs, pos - node[node[idx].ls].siz - node[idx].cnt);
}
int FrontMax(int idx, int val, int CurMax) {
	if (node[idx].val >= val) {
		if (node[idx].ls) return FrontMax(node[idx].ls, val, CurMax);
		else return CurMax;
	}
	else {
		if (!node[idx].rs) return node[idx].val;
		else if (node[idx].cnt) return FrontMax(node[idx].rs, val, node[idx].val);
		else if (!node[idx].cnt) return FrontMax(node[idx].rs, val, CurMax);
	}
}
int BehindMin(int idx, int val, int CurMin) {
	if (node[idx].val <= val) {
		if (node[idx].rs) return BehindMin(node[idx].rs, val, CurMin);
		else return CurMin;
	}
	else {
		if (!node[idx].ls) return node[idx].val;
		else if (node[idx].cnt) return BehindMin(node[idx].ls, val, node[idx].val);
		else if (!node[idx].cnt) return BehindMin(node[idx].ls, val, CurMin);
	}
}
int main() {
	TLE;
	int n, q, e;
	cin >> n;
	while (n--) {
		cin >> q >> e;
		if (q == 1) printf("%d\n", ValToPos(1, e) + 1);
		else if (q == 2) printf("%d\n", PosToVal(1, e));
		else if (q == 3) printf("%d\n", FrontMax(1, e, -INF));
		else if (q == 4) printf("%d\n", BehindMin(1, e, INF));
		else if (q == 5) {
			if (Tail) Add(1, e);
			else {
				Tail++;
				node[Tail].siz = node[Tail].cnt = 1;
				node[Tail].val = e;
			}
		}
	}
	return 0;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值