无旋Treap WA on 6~10求调
查看原帖
无旋Treap WA on 6~10求调
765061
AsiraeM楼主2023/2/11 13:51

记录

#include<bits/stdc++.h>
using namespace std;
//无旋treap
using namespace std::chrono;
const int MOD=0x3f3f3f3f;
struct Node{
	int pri,key,lk,rk,siz,cnt;
}tr[100005];
int n,m,a,b,i,j,k,num,ans,op,x,root;
long long lar;
mt19937 mnd(system_clock::now().time_since_epoch().count());
int add(int Key)
{
	tr[++num].key=Key;
	tr[num].pri=mnd();
	return num;
}
pair<int,int>split(int Root,int Key)
{
	if(!Root)return make_pair(0,0);
	if(Key<tr[Root].key)
	{
		pair<int,int>Lt=split(tr[Root].lk,Key);
		tr[Root].lk=Lt.second;
		tr[Root].siz=tr[tr[Root].lk].siz+tr[tr[Root].rk].siz+tr[Root].cnt;
		return make_pair(Lt.first,Root);
	}
	else
	{
		pair<int,int>Rt=split(tr[Root].rk,Key);
		tr[Root].rk=Rt.first;
		tr[Root].siz=tr[tr[Root].lk].siz+tr[tr[Root].rk].siz+tr[Root].cnt;
		return make_pair(Root,Rt.second);
	}
}
int merge(int U,int V)
{
	if(!U)return V;
	if(!V)return U;
	if(tr[U].pri>tr[V].pri)
	{
		tr[U].rk=merge(tr[U].rk,V);
		tr[U].siz=tr[tr[U].lk].siz+tr[tr[U].rk].siz+tr[U].cnt;
		return U;
	}
	else
	{
		tr[V].lk=merge(U,tr[V].lk);
		tr[V].siz=tr[tr[V].lk].siz+tr[tr[V].rk].siz+tr[V].cnt;
		return V;
	}
}
int insert(int Root,int Key)
{
	pair<int,int>Sp1=split(Root,Key-1);
	pair<int,int>Sp2=split(Sp1.second,Key);
	if(!Sp2.first)Sp2.first=add(Key);
	++tr[Sp2.first].siz;
	++tr[Sp2.first].cnt;
	return merge(merge(Sp1.first,Sp2.first),Sp2.second);
}
int del(int Root,int Key)
{
	pair<int,int>Sp1=split(Root,Key-1);
	pair<int,int>Sp2=split(Sp1.second,Key);
	if(Sp2.first)
		if(tr[Sp2.first].cnt==1)Sp2.first=0;
		else --tr[Sp2.first].siz,--tr[Sp2.first].cnt;
	return merge(merge(Sp1.first,Sp2.first),Sp2.second);
}
int count(int Root,int Key,int& Ans)
{
	pair<int,int>Sp=split(Root,Key-1);
	Ans=tr[Sp.first].siz+1;
	return merge(Sp.first,Sp.second);
}
int query(int Root,int Rnk)
{
	if(tr[tr[Root].lk].siz<Rnk&&tr[tr[Root].lk].siz+tr[Root].cnt>=Rnk)return tr[Root].key;
	if(tr[tr[Root].lk].siz>=Rnk)return query(tr[Root].lk,Rnk);
	return query(tr[Root].rk,Rnk-tr[tr[Root].lk].siz-tr[Root].cnt);
}
int pre(int Root,int Key,int& Ans)
{
	pair<int,int>Sp=split(Root,Key);
	int Now=Sp.first;
	while(Now&&tr[Now].rk)Now=tr[Now].rk;
	Ans=tr[Now].key;
	return merge(Sp.first,Sp.second);
}
int nxt(int Root,int Key,int& Ans)
{
	pair<int,int>Sp=split(Root,Key);
	int Now=Sp.second;
	while(Now&&tr[Now].lk)Now=tr[Now].lk;
	Ans=tr[Now].key;
	return merge(Sp.first,Sp.second);
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(i=1;i<=n;++i)
	{
		cin>>op>>x;
		switch(op)
		{
			case 1:root=insert(root,x);break;
			case 2:root=del(root,x);break;
			case 3:root=count(root,x,ans);cout<<ans<<endl;break;
			case 4:ans=query(root,x);cout<<ans<<endl;break;
			case 5:root=pre(root,x,ans);cout<<ans<<endl;break;
			case 6:root=nxt(root,x,ans);cout<<ans<<endl;break;
		}
	}
	return 0;
}
2023/2/11 13:51
加载中...