二分查找树MLE求助
查看原帖
二分查找树MLE求助
377768
Tooler_Yang楼主2023/1/30 11:04

无treap

// Problem: P3369 【模板】普通平衡树
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3369
// Memory Limit: 128 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
using namespace std;
struct BST{
	int l,r;
	int val,cnt,siz;
}bst[100001];
int tot;
void insert(int &k,int val){
	if(!k){
		k=++tot;
		bst[k].val=val;
		bst[k].cnt=bst[k].siz=1;
		bst[k].l=bst[k].r=0;
		return ;
	}
	bst[k].siz++;
	if(bst[k].val==val){
		bst[k].cnt++;
		return ;
	}
	if(bst[k].val>val) insert(bst[k].l,val);
	if(bst[k].val<val) insert(bst[k].r,val);
}
int ans;
void get_pre(int k,int val){
	if(!k) return ;
	if(bst[k].val>val) get_pre(bst[k].l,val);
	if(bst[k].val<val) ans=k,get_pre(bst[k].r,val);
}
void get_nxt(int k,int val){
	if(!k) return ;
	if(bst[k].val>val) ans=k,get_nxt(bst[k].l,val);
	if(bst[k].val<val) get_nxt(bst[k].r,val);
}
int dell(int &p){
	if(!bst[p].l){
		int u=p;
		p=bst[p].r;
		return u;
	}
	else{
		int u=dell(bst[p].l);
		bst[p].siz-=bst[u].cnt;
		return u;
	}
}
void del(int &k,int val){
	bst[k].siz--;
	if(k==0) return ;
	if(bst[k].val==val){
		if(bst[k].cnt>1){
			bst[k].cnt--;
			return ;
		}
		if(bst[k].l&&bst[k].r){
			k=dell(bst[k].r);
		}
		else{
			k=bst[k].l+bst[k].r;
		}
		return ;
	}
	if(bst[k].val>val) del(bst[k].l,val);
	if(bst[k].val<val) del(bst[k].r,val);
	
}
int get_rank(int k,int val){
	if(bst[k].val==val) return bst[bst[k].l].siz+1;
	if(bst[k].val>val) return get_rank(bst[k].l,val);
	if(bst[k].val<val) return get_rank(bst[k].r,val)+bst[bst[k].l].siz+bst[k].cnt;
}
int get_val(int k,int rnk){
	if(bst[bst[k].l].siz>=rnk) return get_val(bst[k].l,rnk);
	if(bst[bst[k].l].siz<rnk-bst[k].cnt) return get_val(bst[k].r,rnk-bst[bst[k].l].siz-bst[k].cnt);
	return bst[k].val;
}
int rt;
int main(){
	int n;
	rt=1;
	cin>>n;
	while(n--){
		int op,x;
		cin>>op>>x;
		if(op==1){
			insert(rt,x);
		}
		else if(op==2){
			del(rt,x);
		}
		else if(op==3){
			cout<<get_rank(rt,x)<<"\n";
		}
		else if(op==4){
			cout<<get_val(rt,x)<<"\n";
		}
		else if(op==5){
			get_pre(rt,x);
			cout<<bst[ans].val<<"\n";
		}
		else if(op==6){
			get_nxt(rt,x);
			cout<<bst[ans].val<<"\n";
		}
	}
	return 0;
}

是get_rnk函数死循环了,但是不知道怎么改

2023/1/30 11:04
加载中...