FHQ-Treap 46分 WA求调……孩子刚学平衡树,救救孩子……
查看原帖
FHQ-Treap 46分 WA求调……孩子刚学平衡树,救救孩子……
95170
Tune_楼主2022/7/20 22:50

评测记录

#include<bits/stdc++.h>
using namespace std;
int root=0,ll=1,v[100005],l[100005],r[100005],sz[100005],w[100005],n,m;
bool bj[100005];
int New(int vv)
{
	v[ll]=vv;
	sz[ll]=1;
	w[ll]=rand();
	l[ll]=r[ll]=0;
	return ll++;
}
void up_(int p)
{
	if(!p)
		return;
	sz[p]=sz[l[p]]+sz[r[p]]+1;
}
void split(int k,int x,int &a,int &b)
{
	if(!k)
	{
		a=b=0;
		return;
	}
	if(v[k]<=x)
	{
		a=k;
		split(r[k],x,r[k],b);
	}
	else
	{
		b=k;
		split(l[k],x,a,l[k]);
	}
	up_(k);
}
int merge(int a,int b)
{
	if(!a||!b)
		return a+b;
	if(w[a]>w[b])
	{
		r[a]=merge(r[a],b);
		up_(a);
		return a;
	}
	else
	{
		l[b]=merge(a,l[b]);
		up_(b);
		return b;
	}
}
void add(int v)
{
	int a,b;
	split(root,v,a,b);
	root=merge(merge(a,New(v)),b);
}
void era(int v)
{
	int a,b,c;
	split(root,v,a,c);
	split(a,v-1,a,b);
	root=merge(merge(a,merge(l[b],r[b])),c);
}
int pre(int vv)
{
	int a,b,re=-2147483647,p;
	split(root,vv-1,a,b);
	p=a;
	while(p)
	{
		re=v[p];
		int t=p;
		p=r[t];
	}
	root=merge(a,b);
	return re;
}
int nxt(int vv)
{
	int a,b,re=2147483647,p;
	split(root,vv,a,b);
	p=b;
	while(p)
	{
		re=v[p];
		p=l[p];
	}
	root=merge(a,b);
	return re;
}
stack<int>st;
int main()
{
	scanf("%d%d",&n,&m);
	char c;
	int x;
	add(0);
	add(n+1);
	for(int i=1;i<=m;i++)
	{
		cin>>c;
		if(c=='D')
		{
			cin>>x;
			st.push(x);
			bj[x]=1;
			add(x);
		}
		else
		if(c=='R')
		{
			era(st.top());
			st.pop();
			bj[x]=0;
		}
		else
		if(c=='Q')
		{
			cin>>x;
			if(!bj[x])
				printf("%d\n",nxt(x)-pre(x)-1);
			else
				printf("0\n");
		}
	}
	return 0;
}
2022/7/20 22:50
加载中...