Treap WA on #1#2 求调
查看原帖
Treap WA on #1#2 求调
779970
lunjiahao楼主2024/3/20 19:51
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int Q;
int cnt,ls[N],rs[N],val[N],rnd[N],siz[N],re_cnt[N],ans,root;
void push_up(int x)
{
	siz[x]=siz[ls[x]]+siz[rs[x]]+re_cnt[x];
}
void l_rotate(int &k)
{
	int t=rs[k];
	rs[k]=ls[t];
	ls[t]=k;
	siz[t]=siz[k];
	push_up(k);
	k=t;
}
void r_rotate(int &k)
{
	int t=ls[k];
	ls[k]=rs[t];
	rs[t]=k;
	siz[t]=siz[k];
	push_up(k);
	k=t;
}
void insert(int &k,int x)
{
	if(!k)
	{
		k=++cnt;
		siz[k]=1;
		re_cnt[k]=1;
		val[k]=x;
		rnd[k]=rand();
		return;
	}
	siz[k]++;
	if(val[k]==x) re_cnt[k]++;
	else if(val[k]<x)
	{
		insert(rs[k],x);
		if(rnd[rs[k]]<rnd[k]) l_rotate(k);
	}
	else
	{
		insert(ls[k],x);
		if(rnd[ls[k]]<rnd[k]) r_rotate(k);
	}
}
bool del(int &k,int x)
{
	if(!k) return false;
	if(val[k]==x)
	{
		if(re_cnt[k]>1)
		{
			re_cnt[k]--;
			siz[k]--;
			return true;
		}
		if(!ls[k]||!rs[k])
		{
			k=ls[k]+rs[k];
			return true;
		}
		else if(rnd[ls[k]]<rnd[rs[k]])
		{
			r_rotate(k);
			return del(k,x);
		}
		else
		{
			l_rotate(k);
			return del(k,x);
		}
	}
	else if(val[k]<x)
	{
		bool flag=del(rs[k],x);
		if(flag) siz[k]--;
		return flag;
	}
	else
	{
		bool flag=del(ls[k],x);
		if(flag) siz[k]--;
		return flag;
	}
}
int query_rank(int k,int x)
{
	if(!k) return 0;
	if(val[k]==x) return siz[ls[k]]+1;
	else if(val[k]<x) return siz[ls[k]]+re_cnt[k]+query_rank(rs[k],x);
	else return query_rank(ls[k],x);
}
int query_num(int k,int x)
{
	if(!k) return 0;
	if(siz[ls[k]]>=x) return query_num(ls[k],x);
	else if(siz[ls[k]]+re_cnt[k]<x) return query_num(rs[k],x-siz[ls[k]]-re_cnt[k]);
	else return val[k];
}
void query_pre(int k,int x)
{
	if(!k) return;
	if(val[k]<x) ans=k,query_pre(rs[k],x);
	else query_pre(ls[k],x);
}
void query_nxt(int k,int x)
{
	if(!k) return;
	if(val[k]>x) ans=k,query_nxt(ls[k],x);
	else query_nxt(rs[k],x);
}
signed main()
{
	srand(time(0));
	scanf("%d",&Q);
	while(Q--)
	{
		int opt,x;
		scanf("%d%d",&opt,&x);
		if(opt==1) insert(root,x);
		if(opt==2) del(root,x);
		if(opt==3) printf("%d\n",query_rank(root,x));
		if(opt==4) printf("%d\n",query_num(root,x));
		if(opt==5)
		{
			ans=0;
			query_pre(root,x);
			printf("%d\n",val[ans]);
		}
		if(opt==6)
		{
			ans=0;
			query_nxt(root,x);
			printf("%d\n",val[ans]);
		}
	}
	return 0;
}
2024/3/20 19:51
加载中...