玄关求调
查看原帖
玄关求调
748314
yzc001楼主2025/6/14 22:33

甚至7pts

#include<bits/stdc++.h>
using namespace std;
//替罪羊树 
double out=0.75114514;
struct tree{
	int fa,l,r,z,size;
}TZY[100010];
int cnt,root;
vector<int>tre,trae,_empty;
void p_sh(int u){
	tre.push_back(u);
	trae.push_back(TZY[u].z);
	if(TZY[u].l)p_sh(TZY[u].l);
	if(TZY[u].r)p_sh(TZY[u].r);
}
void _grow(int l,int r,int m){
	if(l==r)return;
	else{
		int ls=(l+m)>>1,rs=(r+m+1)>>1;
		if(l!=ls){
			TZY[tre[m]].l=ls;
			TZY[tre[ls]].fa=trae[m];
			_grow(l,m-1,ls);
		}
		if(m+1!=rs){
			_grow(m+1,r,rs);
			TZY[tre[m]].r=rs;
			TZY[tre[rs]].fa=trae[m];
		}
	}
}
void chonggou(int u){
	tre.push_back(u);
	trae.push_back(TZY[u].z);
	if(TZY[u].l)p_sh(TZY[u].l);
	if(TZY[u].r)p_sh(TZY[u].r);
	sort(tre.begin(),tre.end());
	sort(trae.begin(),trae.end());
	int l=0,r=tre.size(),m=(l+r)>>1,ls=(l+m)>>1,rs=(r+m+2)>>1;
	for(int i=0;i<trae.size();i++)TZY[i].z=trae[i];
	TZY[tre[m]].l=ls;
	TZY[tre[ls]].fa=trae[m];
	if(l!=ls)_grow(l,m-1,ls);
	TZY[tre[m]].r=rs;
	TZY[tre[rs]].fa=trae[m];
	if(m!=rs)_grow(m+1,r,rs);
	trae=tre=_empty;
}
//以上为维护平衡代码 
//插入 
void charu(int x,int u){
	if(TZY[u].size==0){
		TZY[++cnt].fa=0; 
		TZY[cnt].z=x; 
		TZY[cnt].size=1;
		root=cnt;
		return;
	}else{
		if(x<TZY[u].z){
			if(TZY[u].l==0){
				TZY[++cnt].fa=u;
				TZY[cnt].z=x; 
				TZY[cnt].size=1; 
				TZY[u].l=cnt; 
			}else{
				if(TZY[TZY[u].l].z<x){
					TZY[++cnt].fa=u;
					TZY[cnt].z=x; 
					TZY[cnt].size=TZY[TZY[u].l].size+1; 
					TZY[cnt].l=TZY[u].l; 
					TZY[TZY[u].l].fa=cnt;
					TZY[u].l=cnt;
				}else charu(x,TZY[u].l);
			}
		}else{
			if(TZY[u].r==0){
				TZY[++cnt].fa=u;
				TZY[cnt].z=x; 
				TZY[cnt].size=1; 
				TZY[u].r=cnt;
			}else{
				if(TZY[TZY[u].r].z>x){
					TZY[++cnt].fa=u;
					TZY[cnt].z=x; 
					TZY[cnt].size=TZY[TZY[u].r].size+1; 
					TZY[cnt].r=TZY[u].r; 
					TZY[TZY[u].r].fa=cnt;
					TZY[u].r=cnt;
				}else charu(x,TZY[u].r);
			}
		}
	}
	TZY[u].size++;
	if(TZY[TZY[u].l].size>TZY[u].size*out)chonggou(u);
	if(TZY[TZY[u].r].size>TZY[u].size*out)chonggou(u);
}
//重构 
void shanchu(int x,int u){
	TZY[u].size--;
	if(x<TZY[u].z)shanchu(x,TZY[u].l); 
	else if(x>TZY[u].z)shanchu(x,TZY[u].r);
	else{
		if(u==root)root=TZY[u].l;
		TZY[TZY[u].l].fa=TZY[u].fa;
		TZY[TZY[u].l].r=TZY[u].r;
		TZY[TZY[u].l].size=TZY[u].size-1;
		TZY[TZY[u].r].fa=TZY[u].l;
	}
	if(TZY[TZY[u].l].size>TZY[u].size*out)chonggou(u);
	if(TZY[TZY[u].r].size>TZY[u].size*out)chonggou(u);
}
//查小 
int xiao(int x,int u){
	if(u==0)return 0;
	else if(x<TZY[u].z)return xiao(x,TZY[u].l); 
	else return xiao(x,TZY[u].r)+TZY[TZY[u].l].size;
}
//排名 
int paimin(int x,int u,int size){
	if(x-size==TZY[u].size)return TZY[u].z;
	else if(x-size<TZY[TZY[u].l].size)return paimin(x,TZY[u].l,size); 
	else return paimin(x,TZY[u].r,size+TZY[TZY[u].l].size);	
}
//前驱 
int qianqu(int x){
	int id=root,pre;
	while(id){
		if(x>TZY[id].z)pre=TZY[id].z,id=TZY[id].r;
		else id=TZY[id].l;
	}
	return pre;
}
//后继 
int houji(int x){
	int id=root,next;
	while(id){
		if(x<TZY[id].z)next=TZY[id].z,id=TZY[id].l;
		else id=TZY[id].r;
	}
	return next;
}
//void outtree(int u){
//	cout<<TZY[u].fa<<' '<<TZY[u].l<<' '<<TZY[u].r<<' '<<TZY[u].z<<' '<<TZY[u].size<<'\n';
//	if(TZY[u].l)outtree(TZY[u].l);
//	if(TZY[u].r)outtree(TZY[u].r);
//}
void outtrae(int u){
	cout<<TZY[u].fa<<' '<<u<<'\n';
	if(TZY[u].l)outtrae(TZY[u].l);
	if(TZY[u].r)outtrae(TZY[u].r);
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,opt,x;
	cin>>n;
	while(n--){
		cin>>opt>>x;
		switch(opt){
			case 1:{
				charu(x,root);
				break;
			}
			case 2:{
				shanchu(x,root);
				break;
			}
			case 3:{
				cout<<xiao(x,root)<<'\n';
				break;
			}
			case 4:{
				cout<<paimin(x,root,0)<<'\n';
				break;
			}
			case 5:{
				cout<<qianqu(x)<<'\n';
				break;
			}
			case 6:{
				cout<<houji(x)<<'\n';
				break;
			}
		}
		cout<<'\n';
		outtrae(root);
		cout<<'\n';
	}
//	outtrae(root);
//	cout<<'\n';
}



2025/6/14 22:33
加载中...