求助,treap51pts,中间一堆点超时
查看原帖
求助,treap51pts,中间一堆点超时
1210321
zhangzhixu000001楼主2024/5/14 20:02
#include <bits/stdc++.h>
using namespace std;
#define io ios::sync_with_stdio(0)
#define randinit srand(time(0))
const int maxn=1e5+5,randmax=9999,randmin=1;
void read(int &n)//没啥用,不用管
{
	n=0;int f=1;char ch=getchar();
	while (ch>='9'||ch<='0')
	{
		if (ch=='-') f=-1;
		ch=getchar();
	}
	while (ch>='0'&&ch<='9')
	{
		n=n*10+ch-48;
		ch=getchar();
	}
}
struct treap{
	int data,val;
	int ls,rs;
	int size;
}tr[maxn];
int cnt,root;
void up(int p)
{
	tr[p].size=tr[tr[p].ls].size+tr[tr[p].rs].size+1;
}
void zag(int &now)
{
	int tmp=tr[now].ls;
	tr[now].ls=tr[tmp].rs;
	tr[tmp].rs=now;
	tr[tmp].size=tr[now].size;
	up(now);
	now=tmp;
}
void zig(int &now)
{
	int tmp=tr[now].rs;
	tr[now].rs=tr[tmp].ls;
	tr[tmp].ls=now;
	tr[tmp].size=tr[now].size;
	up(now);
	now=tmp;
}
void insert(int &now,int data)
{
	if(!now)
	{
		now=++cnt;
		tr[now].size=1;
		tr[now].data=data;
		tr[now].val=rand()%randmax+randmin;
		return;
	}
	tr[now].size++;
	if (data>=tr[now].data) insert(tr[now].rs,data);
	else insert(tr[now].ls,data);
	if (tr[now].ls!=0&&tr[now].val>tr[tr[now].ls].val) zag(now);
	if (tr[now].rs!=0&&tr[now].val>tr[tr[now].rs].val) zig(now);
	up(now);
}
void erase(int &now,int data)
{
	tr[now].size--;
	if (tr[now].data==data)
	{
		if (tr[now].ls==0&&tr[now].rs==0)
		{
			now=0;return;
		}
		if (tr[now].ls==0||tr[now].rs==0)
		{
			now=tr[now].ls+tr[now].rs;return;
		}
		if(tr[tr[now].ls].val<tr[tr[now].rs].val)
		{
			zag(now);
			erase(tr[now].rs,data);
			return;
		}
		else
		{
			zig(now);
			erase(tr[now].rs,data);
			return;
		}
	}
	if (tr[now].data>data) erase(tr[now].ls,data);
	else erase(tr[now].rs,data);
}
int paiming(int now,int data)
{
	if (now==0)
	{
		return 0;
	}
	if (data>tr[now].data) return tr[tr[now].ls].size+1+paiming(tr[now].rs,data);
	else return paiming(tr[now].ls,data);
}
int find(int now,int paiming)
{
	if (paiming==tr[tr[now].ls].size+1) return tr[now].data;
	else if(paiming>tr[tr[now].ls].size+1) return find(tr[now].rs,paiming-tr[tr[now].ls].size-1);
	else return find(tr[now].ls,paiming);
}
int query_pre(int now,int data)
{
	if (!now) return 0;
	if (tr[now].data>=data) return query_pre(tr[now].ls,data);
	int tmp=query_pre(tr[now].rs,data);
	if (!tmp) return tr[now].data;
	else return tmp;
}
int query_suf(int now,int data)
{
	if (!now) return 0;
	if (tr[now].data<=data) return query_suf(tr[now].rs,data);
	int tmp=query_suf(tr[now].ls,data);
	if (!tmp) return tr[now].data;
	else return tmp;
}
int main() {
	io;randinit;
	int op,x,n;cin>>n;
	for (int i=1;i<=n;i++)
	{
		cin>>op>>x;
		switch(op)
		{
			case 1:insert(root,x);break;
			case 2:erase(root,x);break;
			case 3:cout<<paiming(root,x)+1<<endl;break;
			case 4:cout<<find(root,x)<<endl;break;
			case 5:cout<<query_pre(root,x)<<endl;break;
			case 6:cout<<query_suf(root,x)<<endl;break;
			default:break;
		}
	}
	return 0;
}
2024/5/14 20:02
加载中...