fhq-treap MLE求助
查看原帖
fhq-treap MLE求助
260360
阿噫齐贝林楼主2022/9/24 17:15
#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=100005;
int num,rt,n,m,opt;
char op;
int s[N],top,v[N];
struct treap{
	int val,size,ls,rs,rand;
}tr[N];
void update(int p){tr[p].size=tr[tr[p].ls].size+tr[tr[p].rs].size+1;}
int New(int val){tr[++num]={val,1,0,0,rand()};return num;}
void Split(int p,int val,int &x,int &y)
{
	if(!p){x=0;y=0;return;}
	if(tr[p].val<=val)
	{
		x=p;
		Split(tr[p].rs,val,tr[p].rs,y);
	}
	else {
		y=p;
		Split(tr[p].ls,val,x,tr[p].ls);
	}
	update(p);
}
int merge(int x,int y)
{
	if(!x||!y)return x+y;
	if(tr[x].rand<=tr[y].rand)
	{
		tr[x].rs=merge(tr[x].rs,y);
		update(x);return x;
	}
	else{
		tr[y].ls=merge(x,tr[y].ls);
		update(y);return y;
	}
}
void insert(int val)
{
	int x,y;
	Split(rt,val-1,x,y);
	rt=merge(merge(x,New(val)),y);
}
void de(int val)
{
	int x,y,z;
	Split(rt,val,x,y);
	Split(rt,val-1,x,z);
	rt=merge(merge(x,merge(tr[z].ls,tr[z].rs)),y);
}
int Find(int p,int kth)
{
	if(kth==tr[tr[p].ls].size+1)return p;
	if(kth<=tr[tr[p].ls].size)return Find(tr[p].ls,kth);
	else return Find(tr[p].rs,kth-tr[tr[p].ls].size-1);
}
int pre(int val)
{
	int x,y,ass;
	Split(rt,val-1,x,y);
	ass=tr[Find(x,tr[x].size)].val;
	rt=merge(x,y);
	return ass;
}
int nxt(int val)
{
	int x,y,ass;
	Split(rt,val,x,y);
	ass=tr[Find(y,1)].val;
	rt=merge(x,y);
	return ass;
}
signed main()
{
	srand(time(0));
	scanf("%lld%lld",&n,&m);
	insert(0),insert(n+1);
	for(int i=1;i<=m;i++)
	{
		cin>>op;
		if(op=='D')
		{
			scanf("%lld",&opt);s[++top]=opt;
			v[opt]=1;
			insert(opt);
		}
		if(op=='Q')
		{
			scanf("%lld",&opt);
			if(v[opt]==1)printf("0\n");
			else printf("%lld\n",nxt(opt)-pre(opt)-1);
		}
		if(op=='R')
		{
			de(s[top]);
			v[s[top]]=0;
			top--;
		}
	}
}
2022/9/24 17:15
加载中...