社区讨论

全部MLE求助 用BST写的

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

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@lods0ncr
此快照首次捕获于
2023/10/31 11:35
2 年前
此快照最后确认于
2023/11/07 02:00
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
int q,swi,x,lst,root;
struct node{
	int l,r,val,sum,cnt;
}t[maxn];
void insert(int &p,int a){
	if(!p){
		p=++lst;
		t[p].cnt=t[p].sum=1;
		t[p].val=a;
		return;
	}
	if(t[p].val==a){
		t[p].cnt++;t[p].sum++;
		return;
	}
	if(t[p].val>a)
		insert(t[p].l,a);
	else
		insert(t[p].r,a);
	t[p].sum=t[t[p].l].sum+t[t[p].r].sum+t[p].cnt;
}
int lev(int p,int a){
	int tmp=t[t[p].l].sum;
	if(t[p].val==a)
		return tmp+1;
	if(t[p].val>a)
		return lev(t[p].l,a);
	else
		return lev(t[p].r,a)+tmp+t[p].cnt;
}
int lvx(int p,int a){
	if(!p)return t[p].val;
	int tmp=t[t[p].l].sum;
	if(tmp>=a)
		return lvx(t[p].l,a);
	if(tmp<a&&tmp+t[p].cnt>=a)
		return t[p].val;
	if(tmp<a)
		return lvx(t[p].r,a-tmp-t[p].cnt);
}
int pre(int p,int a,int ans){
	if(!p)return ans;
	if(t[p].val>=a)
		return pre(t[p].l,a,ans);
	else
		return pre(t[p].r,a,t[p].val);
}
int bac(int p,int a,int ans){
	if(!p)return ans;
	if(t[p].val<=a)
		return bac(t[p].r,a,ans);
	else
		return bac(t[p].l,a,t[p].val);
}
int main(){
	insert(root,-0x7fffffff);
	insert(root,0x7fffffff);
	scanf("%d",&q);
	while(q--){
		scanf("%d%d",&swi,&x);
		switch(swi){
			case 1:{
				printf("%d\n",lev(root,x));
				break;
			}
			case 2:{
				printf("%d\n",lvx(root,x));
				break;
			}
			case 3:{
				printf("%d\n",pre(root,x,-0x3f3f3f3f));
				break;
			}
			case 4:{
				printf("%d\n",bac(root,x,0x3f3f3f3f));
				break;
			}
			case 5:{
				insert(root,x);
				break;
			}
		}
	}
	return 0;
}

回复

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

正在加载回复...