Treap分数在[7,35]求调
查看原帖
Treap分数在[7,35]求调
776799
GODTREE楼主2025/7/2 11:54
#include <bits/stdc++.h>
const int N=1e6+5;
using namespace std;
int n,cnt,root;
struct tree
{
	int ls,rs,val,sz,p;
}t[N];
void newnode(int x)
{
	t[++cnt].sz=1;
	t[cnt].val=x;
	t[cnt].p=rand();
}
void update(int u)
{
	t[u].sz=t[t[u].ls].sz+t[t[u].rs].sz;
}
void rotate (int &r,int d)// 0:left 1:right
{
	int k;
	if (d==1)
	{
		k=t[r].rs;
		t[r].rs=t[k].ls;
		t[k].ls=r;
	}
	else
	{
		k=t[r].ls;
		t[r].ls=t[k].rs;
		t[k].rs=r;
	}
	t[k].sz=t[r].sz;
	update(r);
	r=k;
}
void insert(int &u,int x)//use & to change the sun which we don't know whose sun it is
{
	if (u==0)
	{
		newnode(x);
		u=cnt;
		return ;
	}
	t[u].sz++;
	if (x>=t[u].val) insert(t[u].rs,x);
	else insert(t[u].ls,x);
	if (t[u].ls!=0&&t[u].p>t[t[u].ls].p) rotate(u,0);//left
	if (t[u].rs!=0&&t[u].p>t[t[u].rs].p) rotate(u,1);//right
	update(u);
}
void delet(int &u,int x)
{
	t[u].sz--;
	if (t[u].val==x)
	{
		if (t[u].ls==0&&t[u].rs==0)
		{
			u=0;
			return ;
		}
		if (t[u].ls==0||t[u].rs==0)
		{
			u=t[u].ls+t[u].rs;//equal the one isn't 0 (push it up)
			return ;
		}
		if (t[t[u].ls].p<t[t[u].rs].p)
		{
			rotate(u,0);//left->x to right
			delet(t[u].rs,x);
			return ;
		}
		else
		{
			rotate(u,1);
			delet(t[u].ls,x);
			return ;
		}
	}
	if (t[u].val>=x) delet(t[u].ls,x);
	else delet(t[u].rs,x);
	update(u);
}
int rk(int u,int x)
{
	if (u==0) return 0;
	if (x>t[u].val) 
	{
		return t[t[u].ls].sz+rk(t[u].rs,x)+1;
	}
	return rk(t[u].ls,x);
}
int kth(int u,int k)
{
	if (k==t[t[u].ls].sz+1)
	{
		return t[u].val;
	}
	if (k>t[t[u].ls].sz+1)
	{
		return kth(t[u].rs,k-t[t[u].ls].sz-1);// every time find the kth of the sun tree
	}
	else
	{
		return kth(t[u].ls,k);
	}
}
int pre(int u,int x)
{
	if (u==0)
	{
		return -1;
	} 
	if (t[u].val>=x)
	{
		return pre(t[u].ls,x);
	}
	if (pre(t[u].rs,x)==-1)
	{
		 return t[u].val;
	}
	else
	{
		return pre(t[u].rs,x);
	}
}
int nxt(int u,int x)
{
	if (u==0)
	{
		return -1;
	} 
	if (t[u].val<=x)
	{
		return nxt(t[u].rs,x);
	}
	if (nxt(t[u].ls,x)==-1)
	{
		 return t[u].val;
	}
	else
	{
		return nxt(t[u].ls,x);
	}
}
int main()
{
	srand(time(NULL));
	cin>>n;
	for (int i=1;i<=n;i++)
	{
		int opt,x;
		cin>>opt>>x;
		if (opt==1)
		{
			insert(root,x);
		}
		if (opt==2)
		{
			delet(root,x);
		}
		if (opt==3)
		{
			cout<<rk(root,x)+1<<"\n";
		}
		if (opt==4)
		{
			cout<<kth(root,x)<<"\n";
		}
		if (opt==5)
		{
			cout<<pre(root,x)<<"\n";
		}
		if (opt==6)
		{
			cout<<nxt(root,x)<<"\n";
		}
	}
	return 0;
}
2025/7/2 11:54
加载中...