社区讨论
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 条回复,欢迎继续交流。
正在加载回复...