01trie 样例TLE球条
查看原帖
01trie 样例TLE球条
559581
Lydia_qwq楼主2023/7/4 20:48
#include<bits/stdc++.h>
using namespace std;
int idx;
struct Trieqwq
{
	int lc,rc,val,fa,lf,tval;
};
bitset<25> b;
Trieqwq t[114514];
void rt()
{
	t[0]=(Trieqwq){-1,-1,-1,-1,1,0};//无实际意义的根节点
}
bool isleaf(int x)//判断一个节点是否为叶子节点
{
	return (t[x].lc==-1)&&(t[x].rc==-1); 
} 
void insert(int x)//插入操作 
{
	int f;
	b=x;
	if(b[24])
	{
		if(t[0].rc==-1)
		{
			t[++idx].val=1;
	      t[idx].fa=0;
	      t[idx].lc=-1;
			t[idx].rc=-1;
			t[idx].tval=1;
	      t[0].rc=idx;
	      f=idx;
	      if(t[0].lc==-1)t[0].lf++;
		}
		else f=t[0].rc;
	}
	else
	{
		if(t[0].lc==-1)
		{
			t[++idx].val=0;
			t[idx].fa=0;
			t[idx].lc=-1;
			t[idx].rc=-1;
			t[idx].tval=0;
			t[0].lc=idx;
			f=idx;
			if(t[0].rc==-1)t[0].lf++;
		}
		else f=t[0].rc;
	}
	for(int i=24;i>0;i--)
	{
		if(b[i-1])
		{
			if(t[f].rc==-1)
			{
				t[++idx].val=1;
				t[idx].fa=f;
				t[idx].lc=-1;
			   t[idx].rc=-1;
			   t[idx].tval=t[f].tval*2+1;
				t[f].rc=idx;
				f=idx;
				if(t[f].lc==-1)t[f].lf++;
			}
			else f=t[f].rc;
	   }
	   else
	   {
	   	if(t[f].lc==-1)
	   	{
	   		t[++idx].val=0;
	   		t[idx].fa=f;
	   		t[idx].lc=-1;
	   		t[idx].rc=-1;
	   		t[idx].tval=t[f].tval*2;
	   		t[f].lc=idx;
	   		f=idx;
	   		if(t[f].rc==-1)t[f].lf++;
			}
			else f=t[f].lc;
		}
	}
}
void erase(int x)//删除操作 
{
	b=x;
	int nd=0;
	for(int i=24;i>=0;i--)
	{
		if(b[i])nd=t[nd].rc;
		else nd=t[nd].lc;
	}
	if(b[0])
	{
		t[t[nd].fa].rc=-1;
		if(t[t[nd].fa].lc!=-1)t[t[nd].fa].lf--;
	}
	else
	{
		t[t[nd].fa].lc=-1;
		if(t[t[nd].fa].rc!=-1)t[t[nd].fa].lf--;
	}
	int dep=0;
	while(nd!=0)
	{
		nd=t[nd].fa;
		dep++;
		if(t[nd].lc==-1&&t[nd].rc==-1)
		{
			if(b[dep])
			{
				t[t[nd].fa].rc=-1;
				if(t[t[nd].fa].lc!=-1)t[t[nd].fa].lf--;
			}
			else
			{
				t[t[nd].fa].lc=-1;
				if(t[t[nd].fa].rc!=-1)t[t[nd].fa].lf--;
			}
		}
	}
}
int rk(int x)//查询排名操作 
{
	b=x;
	int nd=0,ans=0;;
	for(int i=24;i>=0;i--)
	{
		if(b[i])
		{
			nd=t[nd].rc;
			if(t[nd].lc!=-1)ans+=t[t[nd].lc].lf;
		}
		else nd=t[nd].lc;
	}
	return ans+1;
}
int kth(int x)//查询第x名操作 
{
	int nd=0;
	while(!isleaf(nd)) 
	{
		if(t[nd].lc==-1||t[t[nd].lc].lf<=x)
		{
			if(t[nd].lc!=-1)x-=t[t[nd].lc].lf;
			nd=t[nd].rc;
		}
		else nd=t[nd].lc;
	}
	return t[nd].tval;
}
int prev(int x)//前驱操作 
{
	b=x;
	int nd=0;
	for(int i=24;i>=0;i++)
	{
		if(b[i])nd=t[nd].rc;
		else nd=t[nd].lc;
	}
	while(1)
	{
		if(t[t[nd].fa].lc!=-1&&t[t[nd].fa].lc!=nd)
		{
			nd=t[t[nd].fa].lc;
			while(!isleaf(nd))nd=t[nd].rc;
			return t[nd].tval;
		}
		else nd=t[nd].fa;
	}
}
int next(int x)//后继操作 
{
	b=x;
	int nd=0;
	for(int i=24;i>=0;i++)
	{
		if(b[i])nd=t[nd].rc;
		else nd=t[nd].lc;
	}
	while(1)
	{
		if(t[t[nd].fa].rc!=-1&&t[t[nd].fa].rc!=nd)
		{
			nd=t[t[nd].fa].rc;
			while(!isleaf(nd))nd=t[nd].lc;
			return t[nd].tval;
		}
		else nd=t[nd].fa;
	}
}
int main()
{
	int n;
	rt();
	cin>>n;
	for(int i=0,opt,x;i<n;i++)
	{
		cin>>opt>>x;
		if(opt==1)insert(x);
		if(opt==2)erase(x);
		if(opt==3)cout<<rk(x)<<'\n';
		if(opt==4)cout<<kth(x)<<'\n';
		if(opt==5)cout<<prev(x)<<'\n';
		if(opt==6)cout<<next(x)<<'\n';
   }
   return 0;
}
2023/7/4 20:48
加载中...