代码求调,3个关注 in return
查看原帖
代码求调,3个关注 in return
398190
lanretE楼主2022/5/20 22:44

rt,暴力 BST

样例过了提交 0 分

可以帮忙看看吗 qwq

#include<iostream>
using namespace std;
const int N=100010;
int cnt[N];
int siz[N];
int idx;
const int INF=0x7fffffff;

struct node{
	int lc,rc,fa,val;
	bool is_lc;
}bst[N];

void inorder(int u){
	if(u==0) return ;
	inorder(bst[u].lc);
	for(int i=1;i<=cnt[u];++i) cout<<bst[u].val;
	inorder(bst[u].rc);
}

//query:在以u为根节点的子树中找权值为v的节点编号
int find(int u,int v){
	if(u==0 || v==bst[u].val) return u;
	if(v<bst[u].val) return find(bst[u].lc,v);
	else return find(bst[u].rc,v);
} 

//查询max/min
int find_min(int u){
	if(bst[u].lc==0) return u;
	return find_min(bst[u].lc);
} 

int find_max(int u){
	if(bst[u].rc==0) return u;
	return find_max(bst[u].rc);
}

//插入:在u节点挂上一个权值为v新节点
int add(int u,int v,bool lr){
	bst[++idx].val=v;
	bst[idx].fa=u;
	bst[idx].is_lc=lr;
//	bst[idx].lc=bst[idx].rc=0;
	cnt[idx]=siz[idx]=1;
	return idx;
}

void insert(int u,int v){
	if(u==1 && siz[1]==0){//树是空的 
		add(0,v,1);
		return;
	}
	siz[u]++;
	if(bst[u].val==v){//重复值,不增加节点 
		cnt[u]++;
		return;
	}
	if(v<bst[u].val){
		//加到左子树
		if(bst[u].lc==0) bst[u].lc=add(u,v,1);
		else insert(bst[u].lc,v); 
	}
	if(v>bst[u].val){
		//加到右子树
		if(bst[u].rc==0) bst[u].rc=add(u,v,0);
		else insert(bst[u].rc,v); 
	}
} 

//在u为根节点的子树里删除权值为v的节点
void del(int u,int v){
	if(find(u,v)==0) return;
	if(siz[u]==0) return;
	siz[u]--;
	if(bst[u].val==v){
		if(cnt[u]>1){
		 	cnt[u]--;//若有多个,随便删一个
		 	return;
		}
		int p=bst[u].fa;
		bool p_lc=bst[u].is_lc;
		if(bst[u].lc==0 && bst[u].rc==0){
			//u为叶子节点
			if(p_lc) bst[p].lc=0;
			else bst[p].rc=0;
		}
		else if(bst[u].lc && bst[u].rc==0){
			//左链
			if(p_lc) bst[p].lc=bst[u].lc;
			else bst[p].rc=bst[u].lc; 
		}
		else if(bst[u].lc==0 && bst[u].rc){
			//右链
			if(p_lc) bst[p].lc=bst[u].rc;
			else bst[p].rc=bst[u].rc; 
		}
		else if(bst[u].lc && bst[u].rc){
			//二叉树  选择右子树最小节点进行替换
			int r_min=find_min(bst[u].rc);
			bst[u].val=bst[r_min].val;
			del(bst[u].rc,bst[r_min].val);//删除替罪羊 
		}
		return;
	} 
	if(v<bst[u].val) del(bst[u].lc,v);
	if(v>bst[u].val) del(bst[u].rc,v);
}
 
//求rank
int query_rank(int u,int v){
	if(find(u,v)==0) return -1;//不存在
	if(v==bst[u].val) return siz[bst[u].lc]+1;
	if(v<bst[u].val) return query_rank(bst[u].lc,v);
	if(v>bst[u].val) return query_rank(bst[u].rc,v)+siz[bst[u].lc]+cnt[u];
} 

//返回第k大值
int query_kth(int u,int k){
	if(k<1 || k>siz[u]) return -1;
	if(k<=siz[bst[u].lc]) return query_kth(bst[u].lc,k);
	if(k>siz[bst[u].lc]+cnt[u]) return query_kth(bst[u].rc,k-siz[bst[u].lc]-cnt[u]);
	//就在u上
	return bst[u].val;	
} 
int n;
int main(){
	cin>>n;
	for(int i=1;i<=n;++i){
		int opt,x; cin>>opt>>x;
		if(opt==1) cout<<query_rank(1,x)<<endl;
		else if(opt==2) cout<<query_kth(1,x)<<endl;
		else if(opt==3){
			int rk=query_rank(1,x);
			if(rk==1) cout<<-2147483647<<endl; 
			else cout<<query_kth(1,rk-1)<<endl;
		}
		else if(opt==4){
			int rk=query_rank(1,x);
			if(rk==idx) cout<<2147483647<<endl;
			else cout<<query_kth(1,rk+1)<<endl;
		}
		else insert(1,x);
	}
	return 0;
}
2022/5/20 22:44
加载中...