社区讨论

c艹求调(玄二关)

P5076【深基16.例7】普通二叉树(简化版)参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhjrd6fc
此快照首次捕获于
2025/11/04 07:15
4 个月前
此快照最后确认于
2025/11/04 07:15
4 个月前
查看原帖
跟着深入浅出用的查找树,但是爆了5个MLE 1个TLE,感觉再跟书改就变成抄书了
CPP
#include<bits/stdc++.h>
#define ll int
using namespace std;
const int N=1e5+10;
struct fk {
	ll left,right,val,size,num;
	fk(ll l,ll r,ll v,ll s)
		:left(l),right(r),val(v),size(s),num(1) {}
	fk() {}
} t[N];
ll q;
ll cnt;//cnt为这个节点编号
inline void oset(ll root) {
	t[root].size=t[t[root].left].size+t[t[root].right].size+t[root].num;
}
void ins(ll x,ll root) {
	if(x<t[root].val) {
		if(!t[root].left) {
			t[t[root].left = ++cnt]=fk(0,0,x,1);
		} else {
			ins(x,t[root].left);
		}
	} else if(x>t[root].val) {
		if(!t[root].right) {
			t[t[root].right = ++cnt]=fk(0,0,x,1);
		} else {
			ins(x,t[root].right);
		}
	} else {
		t[root].num++;
	}
	oset(root);
}
int find(ll x,ll root) {
	if(x<t[root].val) {
		return find(x,t[root].left);
	} else if(x>t[root].val) {
		return find(x,t[root].right)+t[t[root].left].size+t[root].num;
	} else {
		return t[t[root].left].size+t[root].num;
	}
	return 1;
}
int paim(ll x,ll root) {
	if(x<=t[t[root].left].size) {
		return paim(x,t[root].left);
	} else if(x<=t[t[root].left].size+t[root].num) {
		return t[root].val;
	} else {
		return paim(x-t[t[root].left].size-t[root].num,t[root].right);
	}

}
int main() {
	cin>>q;
	ll root;
	t[root= ++cnt]=fk(0,0,INT_MAX,1);
	for(int i=1; i<=q; i++) {
		ll op,x;
		cin>>op>>x;
		if(op==1) cout<<find(x,root)<<'\n';
		if(op==2) cout<<paim(x,root)<<'\n';
		if(op==3) cout<<paim(find(x,root)-1,root)<<'\n';
		if(op==4) cout<<paim(find(x+1,root),root)<<'\n';
		if(op==5) ins(x,root);
	}
	return 0;
}
求调

回复

2 条回复,欢迎继续交流。

正在加载回复...