新手splay死循环!!!
查看原帖
新手splay死循环!!!
882092
zMinYu楼主2023/4/19 22:10

问题貌似处在splay函数上。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct node
{
	int s[2],size,p,v,flag;
	void init(int _v,int _p)
	{
		v=_v;
		p=_p;
		size=1;
	}
}tr[N];
int m,n,root,idx;
void pushdown(int u)
{
	if(tr[u].flag)
	{
		swap(tr[u].s[0],tr[u].s[1]);
		tr[tr[u].s[0]].flag^=1;
		tr[tr[u].s[1]].flag^=1;
		tr[u].flag=0;
	}
}
void pushup(int u)
{
	tr[u].size=tr[tr[u].s[0]].size+tr[tr[u].s[1]].size+1;
}
void rotate(int x)
{
	int y=tr[x].p,z=tr[y].p;
	int k=(tr[x].s[1]==x); //父子关系 
	tr[x].p=z,tr[z].s[tr[z].s[1]==y]=x;
	tr[tr[x].s[k^1]].p=y,tr[y].s[k]=tr[x].s[k^1];
	tr[y].p=x,tr[x].s[k^1]=y;
	pushup(y);
	pushup(x);
}
void splay(int x,int k)
{
	while(tr[x].p!=k)
	{
		int y=tr[x].p,z=tr[y].p;
		if(z!=k)
		{
			//异或,相同为false
			if((y==tr[z].s[1])^(x==tr[y].s[1])) rotate(x); //直线 
			else rotate(y); //折线 
		}
		rotate(x);
		cout<<x<<endl;
	}
	if(!k) root=x;
}
void insert(int k)
{
	int u=root,p=0; //p是u的爹
	while(u) p=u,u=tr[u].s[k>tr[u].v];
	u=++idx;
	tr[u].init(k,p);
	if(p)
	{
		tr[p].s[k>tr[u].v]=u;
		tr[k].p=p;
	} 
	splay(u,0);
}
void out(int u)
{
	pushdown(u);
	if(tr[u].s[0]) out(tr[u].s[0]);
	if(tr[u].v>=1&&tr[u].v<=n) printf("%d ",tr[u].v);
	if(tr[u].s[1]) out(tr[u].s[1]);
}
int get_rank(int x)
{
	int u=root;
	while(1)
	{
		pushdown(u);
		if(tr[tr[u].s[0]].size+1==x) return u;
		else if(x>tr[tr[u].s[0]].size+1) x-=tr[tr[u].s[0]].size+1,u=tr[u].s[1];
		else u=tr[u].s[0];
	}
}
int main()
{
	cin>>n>>m;
	for(int i=0;i<=n+1;i++)
	{
		insert(i);
	} 
	while(m--)
	{
		int l,r;
		cin>>l>>r;
		l=get_rank(l),r=get_rank(r+2);
		splay(l,0);
		splay(r,l);
		tr[tr[r].s[0]].flag^=1;
	}
	out(root);
	return 0;
} 
2023/4/19 22:10
加载中...