找前驱出了大问题,蒟蒻求助!!
查看原帖
找前驱出了大问题,蒟蒻求助!!
133884
MFJ0v0楼主2020/10/27 13:51
#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
const ll maxn = 100010;
const ll inf = 0x7fffffff;
ll n, x, op, bnt = 0;
struct node {
	ll size, cnt, l, r, w;
} tree[4 * maxn + 1];
void add(ll k, ll v) {
	tree[k].size ++;
	if (tree[k].w == v) {
		tree[k].cnt ++;
		return;
	}
	if (tree[k].w > v) {
		if (tree[k].l != 0) {
			add(tree[k].l, v);
		} else {
			bnt ++;
			tree[bnt].size = 1;
			tree[bnt].cnt = 1;
			tree[k].l = bnt;
			tree[bnt].w = v;
		}
	} else {
		if (tree[k].r != 0) {
			add(tree[k].r, v);
		} else {
			bnt ++;
			tree[bnt].size = 1;
			tree[bnt].cnt = 1;
			tree[bnt].w = v;
			tree[k].r = bnt;
		}
	}
}
ll getRank(ll k, ll v) {
	if (k == 0) {
		return 0;
	}
	if (tree[k].w = v) {
		return tree[tree[k].l].size + 1;
	}
	if (tree[k].w > v) {
		return getRank(tree[k].l, v);
	}
	return getRank(tree[k].r, v) + tree[tree[k].l].size + tree[k].cnt;
} 
ll getVal(ll k, ll rank) {
	if (k == 0) {
		return inf;
	}
	if (tree[tree[k].l].size >= rank) {
		return getVal(tree[k].l, rank);
	}
	if (tree[tree[k].l].size + tree[k].cnt >= rank) {
		return tree[k].w;
	}
	return getVal(tree[k].r, rank - tree[tree[k].l].size - tree[k].cnt);
}
ll getPre(ll k, ll v, ll ans){
	if (tree[k].w >= v) {
		if (tree[k].l == 0) {
			return ans;
		} else {
			return getPre(tree[k].l ,v ,ans);
		}
	} else {
		if (tree[k].r == 0) {
			if (tree[k].w < v) {
				return tree[k].w;
			} else {
				return ans;
			}
		}
		if (tree[k].cnt != 0) {
			return getPre(tree[k].r, v, tree[k].w);
		} else {
			return getPre(tree[k].r, v, ans);
		}
	}
}
ll getNext(ll k, ll v, ll ans) {
	if (tree[k].w <= v) {
		if (tree[k].r == 0) {
			return ans;
		} else {
			return getNext(tree[k].r, v, ans);
		}
	} else {
		if (tree[k].l == 0) {
			if (tree[k].w > v) {
				return tree[k].w;
			} else {
				return ans;
			}
		}
		if (tree[k].cnt != 0) {
			return getNext(tree[k].l, v, tree[k].w);
		} else {
			return getNext(tree[k].l, v, ans);
		}
	}
}
int main() {
	scanf("%d" ,&n);
	while (n --) {
		scanf("%d%d" ,&op ,&x);
		if (op == 1) {
			printf("%d\n", getRank(1, x) + 1);
		} else if (op == 2) {
			printf("%d\n", getVal(1, x));
		} else if (op == 3) {
			printf("%d\n", getPre(1, x, -inf));
		} else if (op == 4) {
			printf("%d\n", getNext(1, x, inf));
		} else {
			if (bnt == 0){
				bnt ++;
				tree[bnt].size = 1;
				tree[bnt].cnt = 1;
				tree[bnt].w = x; 
			} else {
				add(1,x);
			}
		}
		
	}
	return 0;
} 

感谢所有的回答者!!

2020/10/27 13:51
加载中...