WA & MLE & TLE 42分求调
查看原帖
WA & MLE & TLE 42分求调
527300
W_C_B_H楼主2024/8/27 19:04

rt,评测记录,Code:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define N 100005
const int inf=0x3f3f3f3f;
int T,tot=0,root=0,key[N],size[N],lson[N],rson[N];
void output_num(int p)	//从小到大输出 (中序遍历) 以 p 为根的子树中每个节点的值 (调试用) 
{
	if(!p)
	{
		return;
	}
	output_num(lson[p]);
	cout<<key[p]<<",";
	output_num(rson[p]);
}
void output_node(int p)	//输出 (前序遍历) 以 p 为根的子树中每个节点 (调试用) 
{
	if(!p)
	{
		return;
	}
	cout<<p<<"位置: key="<<key[p]<<"  size="<<size[p]<<"  lson="<<lson[p]<<"  rson="<<rson[p]<<"\n";
	output_node(lson[p]);
	output_node(rson[p]);
}
void L_rotate(int &p)  	//对节点 p 左旋 
{
//	cout<<"L("<<p<<")\n";
	int k = rson[p];
	rson[p] = lson[k];
	lson[k] = p;
	size[k] = size[p];
	size[p] = size[lson[p]] + size[rson[p]] + 1;
	p = k;
}
void R_rotate(int &p)  	//对节点 p 右旋 
{
//	cout<<"R("<<p<<")\n";
	int k = lson[p];
	lson[p] = rson[k];
	rson[k] = p;
	size[k] = size[p];
	size[p] = size[lson[p]] + size[rson[p]] + 1;
	p = k;
}
void maintain(int &p,bool flag)  	//维护节点 p 的平衡性 
{
	if(!p)
	{
		return;
	}
	int l=lson[p], r=rson[p], sl=size[l], sr=size[r];
	if(!flag)
	{
		if(size[rson[r]] > sl)
		{
			L_rotate(p);
		}
		else if(size[lson[l]] > sr)
		{
			R_rotate(p);
		}
		else
		{
			return;
		}
	}
	else
	{
		if(size[rson[l]] > sr)
		{
			L_rotate(lson[p]);
			R_rotate(p);
		}
		else if(size[lson[r]] > sl)
		{
			R_rotate(rson[p]);
			L_rotate(p);
		}
		else
		{
			return;
		}
	}
	maintain(lson[p],0);
	maintain(rson[p],1);
	maintain(p,0);
	maintain(p,1);
}
void insert(int &p,int v)  	//在以 p 为根的子树里插入 v 
{
	if(size[p]==0)
	{
		p=0;
	}
//	cout<<"insert("<<p<<","<<v<<")\n";
	if(!p)
	{
		p=++tot;
		key[p]=v;
		size[p]=1;
		lson[p]=rson[p]=0;
//		cout<<p<<"位置: key="<<key[p]<<"\n";
	}
	else
	{
		size[p]++;
		if(v < key[p])
		{
			insert(lson[p],v);
//			cout<<"lson["<<p<<"]="<<lson[p]<<"\n";
		}
		else
		{
			insert(rson[p],v);
//			cout<<"rson["<<p<<"]="<<rson[p]<<"\n";
		}
		maintain(p,v>=key[p]);
	}
}
int maxNode(int p)	//查找以 p 为根的子树里值最大的节点 
{
	while(rson[p])
	{
		p=rson[p];
	}
	return p;
}
void remove(int &p,int v)  	//删除在以 p 为根的子树里值为 v 的节点
{
	if(!p)
	{
		return;
	}
//	cout<<"remove("<<p<<","<<v<<")\n";
	if(key[p]==v)
	{
		int ret=key[p];
		if(!lson[p] || !rson[p])
		{
			p=lson[p]+rson[p];
//			cout<<"p="<<p<<"\n";
		}
		else
		{
			int tmp=maxNode(lson[p]);
			remove(lson[p],key[tmp]);
			lson[tmp]=lson[p];
			rson[tmp]=rson[p];
			p=tmp;
//			cout<<"tmp="<<tmp<<"  lson[p]="<<lson[p]<<"  rson[p]="<<rson[p]<<"  size[p]="<<size[p]<<"\n";
			size[p]=size[lson[p]]+size[rson[p]];
		}
		return;
	}
	size[p]--;
	if(v<key[p])
	{
		remove(lson[p],v);
	}
	else
	{
		remove(rson[p],v);
	}
}
int rnk(int p,int v)	//查询在以 p 为根的子树里值为 v 的节点的排名 
{
	if(size[p]==0)
	{
		p=0;
	}
	if(!p)
	{
		return 1;
	}
	if(v<=key[p])
	{
		return rnk(lson[p],v);
	}
	return size[lson[p]] + 1 + rnk(rson[p],v);
}
int kth(int p,int k)	//查询在以 p 为根的子树里排名为 k 的节点的值 
{
	int s=size[lson[p]]+1;
	if(s==k)
	{
		return key[p];
	}
	if(s>k)
	{
		return kth(lson[p],k);
	}
	return kth(rson[p],k-s);
}
int prec(int p,int v)	//查询在以 p 为根的子树里值为 v 的节点的前驱 
{
	if(!p)
	{
		return inf;
	}
	if(v<=key[p])
	{
		return prec(lson[p],v);
	}
	int k=prec(rson[p],v);
	return (k^inf ? k : key[p]);
}
int succ(int p,int v)	//查询在以 p 为根的子树里值为 v 的节点的后继 
{
	if(!p)
	{
		return inf;
	}
	if(v>=key[p])
	{
		return succ(rson[p],v);
	}
	int k=succ(lson[p],v);
	return (k^inf ? k : key[p]);
}
signed main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);
//	cout.tie(0);
	cin>>T;
	while(T--)
	{
		int op,x;
		cin>>op>>x;
		if(op==1)
		{
			insert(root,x);
//			output_num(root);
//			cout<<"\n";
//			output_node(root);
		}
		else if(op==2)
		{
			remove(root,x);
//			output_num(root);
//			cout<<"\n";
//			output_node(root);
		}
		else if(op==3)
		{
			cout<<rnk(root,x)<<"\n";
		}
		else if(op==4)
		{
			cout<<kth(root,x)<<"\n";
		}
		else if(op==5)
		{
			cout<<prec(root,x)<<"\n";
		}
		else
		{
			cout<<succ(root,x)<<"\n";
		}
	}
	return 0;
}
2024/8/27 19:04
加载中...