Treap求助!24pts
查看原帖
Treap求助!24pts
375403
NASFsky楼主2022/7/12 14:39

只AC了#1 #2 #11,大佬求调 QAQ

#include<bits/stdc++.h>
#define N 1000020
using namespace std;
int n,rt,tot,ls[N],rs[N],val[N],ord[N],siz[N],cnt[N];
void push_up(int id){siz[id]=siz[ls[id]]+rs[id]+cnt[id];}
void turn_right(int &id)
{
	int t=ls[id];
	ls[id]=rs[t];
	rs[t]=id;
	push_up(ls[id]);
	push_up(id);
	id=t;
}
void turn_left(int &id)
{
	int t=rs[id];
	rs[id]=ls[t];
	ls[t]=id;
	siz[t]=siz[id];
	push_up(rs[id]);
	push_up(id);
	id=t;
}
void insert(int &id,int x)
{
	if(!id)
	{
		id=++tot;
		siz[id]=cnt[id]=1;
		val[id]=x;
		ord[id]=rand();
		return;
	}
	siz[id]++;
	if(val[id]==x)cnt[id]++;
	else if(val[id]<x)
	{
		insert(rs[id],x);
		if(ord[rs[id]]<ord[id])turn_left(id);
	}
	else
	{
		insert(ls[id],x);
		if(ord[ls[id]]<ord[id])turn_right(id);
	}
	push_up(id);
}
void del(int &id,int x)
{
	if(!id)return;
	if(val[id]==x)
	{
		if(cnt[id]>1)
		{
			cnt[id]--;
			push_up(id);
			return;
		}
		if(ls[id]||rs[id])
		{
			if(!rs[id]||ord[ls[id]]>ord[rs[id]])
			{
				turn_right(id);
				del(rs[id],x); 
			}
			else 
			{
				turn_left(id);
				del(ls[id],x);
			}
			push_up(id);
		}
		else id=0;
		return;
	}
	if(x<val[id])del(ls[id],x);
	else del(rs[id],x);
	push_up(id);
}
int query_rk(int id,int x)
{
	if(!id)return 0;
	if(val[id]==x)return siz[ls[id]]+1;
	else if(x<val[id])return query_rk(ls[id],x);
	else return siz[ls[id]]+cnt[id]+query_rk(rs[id],x);
}
int query_val(int id,int rk)
{
	if(!id)return 0x3f3f3f3f;
	if(rk<=siz[ls[id]])return query_val(ls[id],rk);
	else if(rk<=siz[ls[id]]+cnt[id])return val[id];
	else return query_val(rs[id],rk-siz[ls[id]]-cnt[id]); 
}
int query_pre(int x)
{
	int id=rt,pre;
	while(id)
	{
		if(val[id]<x)
		{
			pre=val[id];
			id=rs[id];
		}
		else id=ls[id];
	}
	return pre;
}
int query_next(int x)
{
	int id=rt,nxt;
	while(id)
	{
		if(val[id]>x)
		{
			nxt=val[id];
			id=ls[id];
		}
		else id=rs[id];
	}
	return nxt;
}
int main()
{
//	freopen("1.txt","w",stdout);
	srand(time(0));
	cin>>n;
	while(n--)
	{
		int op,x;
		cin>>op>>x;
		switch(op)
		{
			case 1:insert(rt,x);break;
			case 2:del(rt,x);break;
			case 3:cout<<query_rk(rt,x)<<endl;break;
			case 4:cout<<query_val(rt,x)<<endl;break;
			case 5:cout<<query_pre(x)<<endl;break;
			case 6:cout<<query_next(x)<<endl;break;
		}
	}
	return 0;
 } 
2022/7/12 14:39
加载中...