警示后人:Treap 92pt
查看原帖
警示后人:Treap 92pt
1601469
TJ_brother楼主2025/8/30 08:45

1.错误代码

#include<bits/stdc++.h>
using namespace std;
int qlt,qnt;

struct no{
	no *son[2];
	int siz,rcnt,val,rank;
	no(int val):val(val),rcnt(1),siz(1){
		son[0]=son[1]=nullptr;
		rank=rand();
	}
	void upd(){
		siz=rcnt;
		if(son[0]!=nullptr)siz+=son[0]->siz;
		if(son[1]!=nullptr)siz+=son[1]->siz;
	}
};
no* rt=nullptr;
void turn(no* &cur,bool f){
	no* tmp=cur->son[f];
	cur->son[f]=tmp->son[!f];
	tmp->son[!f]=cur;
	cur->upd(),tmp->upd();
	cur=tmp;
}
void insert(no* &cur,int val){
	if(cur==nullptr){
		cur=new no(val);
		return ;
	}
	if(val==cur->val){
		cur->rcnt++;
		cur->upd();
	}else if(val<cur->val){
		insert(cur->son[0],val);
		if(cur->son[0]->rank<cur->rank){
			turn(cur,0);
		}
		cur->upd();
	}else{
		insert(cur->son[1],val);
		if(cur->son[1]->rank<cur->rank){
			turn(cur,1);
		}
		cur->upd();
	}
}
void del(no* &cur,int val){
	if(cur==nullptr)return;
	if(val<cur->val){
		del(cur->son[0],val);
		cur->upd();
		return;
	}
	if(val>cur->val){
		del(cur->son[1],val);
		cur->upd();
		return;
	}
	if(cur->rcnt>1){
		//cout << "pass\n"; 
		cur->rcnt--;
		cur->siz--;
		cur->upd();
		return;
	}
	if(cur->son[0]==nullptr and cur->son[1]==nullptr){
		cur=nullptr;
		return;
	}
	if(cur->son[0]==nullptr and cur->son[1]!=nullptr){
		no* tmp=cur->son[1];
		delete cur;
		cur=tmp;
		
		cur->upd();
		return;
	}
	if(cur->son[0]!=nullptr and cur->son[1]==nullptr){
		
		no* tmp=cur->son[0];
		delete cur;
		cur=tmp;
		cur->upd();
		return;
	}
	if(cur->son[0]!=nullptr and cur->son[1]!=nullptr){
		bool f=(cur->son[0]->rank<cur->son[1]->rank);
		turn(cur,f);
		del(cur->son[!f],val);
		cur->upd();
		return;
	}
}
int get_rank(no* cur,int val){
	if(cur==nullptr)return 0;
	int lsiz=(cur->son[0]==nullptr?0:cur->son[0]->siz);
	if(val==cur->val){
		return lsiz+1;		
	}
	if(val<cur->val){
		if(cur->son[0]!=nullptr){
			return get_rank(cur->son[0],val);
			
		}else{
			return 1;
		}
	}
	if(cur->son[1]!=nullptr){
		return lsiz+cur->rcnt+get_rank(cur->son[1],val);
	}else{
		return cur->siz+1;
	}
	
}
int get_val(no* cur,int rank){
	if(cur==nullptr)return 0;
	int lsiz=(cur->son[0]==nullptr?0:cur->son[0]->siz);
	if(rank<=lsiz){
		return get_val(cur->son[0],rank);
	}
	if(rank<=lsiz+cur->rcnt){
		return cur->val;
	}
	return get_val(cur->son[1],rank-cur->rcnt-lsiz);
	
}
int get_last(no* cur,int val){
	if(cur==nullptr)return 0;
	if(val<=cur->val){
		if(cur->son[0]!=nullptr)return get_last(cur->son[0],val);
		return 0;
	}else{
		qlt=cur->val;
		if(cur->son[1]!=nullptr)get_last(cur->son[1],val);
		return qlt;
	}
}
int get_next(no* cur,int val){
	if(cur==nullptr)return 0;
	if(val>=cur->val){
		if(cur->son[1]!=nullptr)return get_next(cur->son[1],val);
		return 0;
	}else{
		qnt=cur->val;
		if(cur->son[0]!=nullptr)get_next(cur->son[0],val);
		return qnt;
	}
}
int main(){
	//freopen("P6136_11.in", "r", stdin);
	int n,lst=0,ans=0,m;
	cin>>m>>n;
	for(int i=1;i<=m;i++){
		int a;cin>>a;
		insert(rt,a);
	}
	while(n--){
		int opt,x;
		cin>>opt>>x;
		if(opt==1){
			insert(rt,x^lst);
			
		}
		if(opt==2)del(rt,x^lst);
		if(opt==3){
			lst=get_rank(rt,x^lst);
			ans^=lst;
		}
		if(opt==4){
			lst=get_val(rt,x^lst);
			ans^=lst;
		}
		if(opt==5){
			lst=get_last(rt,x^lst);
			ans^=lst;
		}
		if(opt==6){
			lst=get_next(rt,x^lst);
			ans^=lst;
		}
	}
	cout<<ans;
	return 0;
}
/*
5
1 2 5 4 3
*/

2.修改

'''get_rank'''函数当整个平衡树为空时,应当返回1。

int get_rank(no* cur,int val){
	if(cur==nullptr)return 1;//这里一定要返回1,因为当平衡树为空时,任意一个值的排名应该为1
	int lsiz=(cur->son[0]==nullptr?0:cur->son[0]->siz);
	if(val==cur->val){
		return lsiz+1;		
	}
	if(val<cur->val){
		if(cur->son[0]!=nullptr){
			return get_rank(cur->son[0],val);
			
		}else{
			return 1;
		}
	}
	if(cur->son[1]!=nullptr){
		return lsiz+cur->rcnt+get_rank(cur->son[1],val);
	}else{
		return cur->siz+1;
	}
	
}
2025/8/30 08:45
加载中...