bzoj3223:Tyvj 1729 文艺平衡树 Splay

注意下传翻转标记,还有在bzoj上不能输出换行符。

#include<bits/stdc++.h>
using namespace std;
struct one
{
	int fa,rec,sum,ch[2],v,tg;
};
one tree[1000000];
int l,r,n,m,tot=0,sum=0;
bool f[500000];
#define root tree[0].ch[1]
void maketree(int l,int r)
{
	int mid=(l+r)>>1;
	tree[++tot].v=mid;
	f[mid]=true;
	tree[tot].rec=1;
	int now=tot;
	if(l==mid)
	{
		if(r==mid||f[r]){tree[tot].sum=1;return;}
		tree[tot].sum=2;
		tree[tot].ch[1]=tot+1;
		tot++;
		tree[tot].rec=1;tree[tot].sum=1;
		tree[tot].v=r;
		tree[tot].fa=tot-1;
		return;
	}
	if(!f[(l+mid)/2])
	{
		tree[tot+1].fa=now;
		tree[now].ch[0]=tot+1;
		maketree(l,mid);
	}
	if(!f[(mid+r+1)/2])
	{
		tree[tot+1].fa=now;
		tree[now].ch[1]=tot+1;
		maketree(mid+1,r);
		
	}
	tree[now].sum=tree[tree[now].ch[0]].sum+tree[tree[now].ch[1]].sum+1;
}
inline void worktg(int x)
{
	if(tree[x].tg)
	{
		swap(tree[x].ch[0],tree[x].ch[1]);
		tree[tree[x].ch[0]].tg^=1;
		tree[tree[x].ch[1]].tg^=1;
		tree[x].tg=0;
	}
}
inline int arank(int x)
{
	int now=root;
	while(1)
	{
		worktg(now);
		int used=tree[now].sum-tree[tree[now].ch[1]].sum;
		if(x<=used&&x>tree[tree[now].ch[0]].sum)break;
		if(x<used)now=tree[now].ch[0];
		else x-=used,now=tree[now].ch[1];
	}
	return now;
}
inline int iden(int x)
{
	return tree[tree[x].fa].ch[0]==x?0:1;
}
inline void connect(int x,int fa,int how)
{
	tree[x].fa=fa;
	tree[fa].ch[how]=x;
}
inline void update(int x)
{
	tree[x].sum=tree[tree[x].ch[0]].sum+tree[tree[x].ch[1]].sum+1;
}
inline void rotate(int x)
{
	int Y=tree[x].fa;
	int R=tree[Y].fa;
	int Yson=iden(x);
	int Rson=iden(Y);
	int B=tree[x].ch[Yson^1];
	connect(x,R,Rson);
	connect(Y,x,Yson^1);
	connect(B,Y,Yson);
	update(Y);update(x);
}
void splay(int x,int to)
{
	to=tree[to].fa;
	while(tree[x].fa!=to)
	{
		if(tree[tree[x].fa].fa==to)rotate(x);
		else if(iden(x)==iden(tree[x].fa))rotate(tree[x].fa),rotate(x);
		else rotate(x),rotate(x);
	}
}
void dfs(int p)
{
	if(!p)return;
	worktg(p);
	dfs(tree[p].ch[0]);
	sum++;
	if(sum!=n)printf("%d ",tree[p].v);
	else printf("%d",tree[p].v);
	dfs(tree[p].ch[1]);
}
int main()
{
	//freopen("xf.in","r",stdin);
	scanf("%d%d",&n,&m);
	maketree(1,n);
	tree[1].fa=0;
	tree[0].ch[1]=1;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&l,&r);
		l--,r++;
		if(l==0&&r==n+1)
		{
			tree[root].tg^=1;
		}
		else if(l==0)
		{
			int p=arank(r);
			splay(p,root);
			tree[tree[root].ch[0]].tg^=1;
		}
		else if(r==n+1)
		{
			int p=arank(l);
			splay(p,root);
			tree[tree[root].ch[1]].tg^=1;
		}
		else 
		{
			int p=arank(l);
			splay(p,root);
			p=arank(r);
			splay(p,tree[root].ch[1]);
			tree[tree[tree[root].ch[1]].ch[0]].tg^=1;
		}
	}
	dfs(root);
	return 0;
}

  

原文地址:https://www.cnblogs.com/mybing/p/8429969.html