为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。

Sgu/187

来自NOCOW
< Sgu
跳转到: 导航, 搜索

基础的splay

//by hza
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<string>
using namespace std;
 
const int MAX=130000+10;
 
int n,m;
 
int size[MAX],key[MAX],ch[MAX][2],pre[MAX],root;
bool rev[MAX];
 
int swap(int &a,int &b){int t=a;a=b;b=t;}
 
void pushdown(int x)
{
	if(!x)return;
	if(rev[x])
	{
		rev[x]^=1;
		if(ch[x][0])rev[ch[x][0]]^=1;
		if(ch[x][1])rev[ch[x][1]]^=1;
		swap(ch[x][0],ch[x][1]);
	}
}
 
void updata(int x)
{
	if(!x)return;
	pushdown(x);
	pushdown(ch[x][0]);
	pushdown(ch[x][1]);
	size[x]=size[ch[x][0]]+size[ch[x][1]]+1;
}
 
void rorate(int x,int T)
{
	int y=pre[x];
	if(T)
	{
		pre[ch[x][1]]=y;
		ch[y][0]=ch[x][1];
		ch[x][1]=y;
	}else
	{
		pre[ch[x][0]]=y;
		ch[y][1]=ch[x][0];
		ch[x][0]=y;
	}
	pre[x]=pre[y];
	pre[y]=x;
	if(ch[pre[x]][1]==y)ch[pre[x]][1]=x;
	else ch[pre[x]][0]=x;
	updata(x);
	updata(y);
	return;
}
 
void splay(int x,int goal)
{
	if(x==goal)return;
	if(goal==0)root=x;
	int y,t;
	for(;pre[x]!=goal;)
	{
		int y=pre[x],t=pre[y];
		if(t==goal)
			rorate(x,ch[y][0]==x);
		else if(ch[t][0]==y)
		{
			if(ch[y][0]==x){rorate(x,1);rorate(x,1);}
			else if(ch[y][1]==x){rorate(x,0);rorate(x,1);}
		}else
		{
			if(ch[y][1]==x){rorate(x,0);rorate(x,0);}
			else if(ch[y][0]==x){rorate(x,1);rorate(x,0);}
		}
	}
}
 
int rank(int k)
{
	int x=0,done;
	for(;;)
	{
		updata(x);
		if(done+size[ch[x][0]]+1==k)
			return x;
		else if(done+size[ch[x][0]]+1<k)
		{
			done+=size[ch[x][0]]+1;
			x=ch[x][1];
		}else x=ch[x][0];
	}
}
 
void build()
{
	int i,j,k;
	size[0]=0;
	for(i=1;i<=n+2;++i)
	{
		key[i]=i;
		size[i]=n+3-i;
		rev[i]=0;
		if(i+1<=n+2)ch[i][1]=i+1;
		pre[i]=i-1;
	}
	root=1;
}
 
void output()
{
	int i,j,k;
	for(i=2;i<=n+1;++i)
	{
		k=rank(i);
		splay(k,0);
		//cout<<key[k]-1<<" ";
	}
}
void work()
{
	int i,x,y,l,r;
	for(i=1;i<=m;++i)
	{
		cin>>l>>r;
		x=rank(l),y=rank(r+2);
		splay(x,0);
		splay(y,x);
		rev[ch[y][0]]^=1;
	}
	output();
}
 
int main()
{
	freopen("187.in","r",stdin);
	freopen("187.out","w",stdout);
	cin>>n>>m;
	work();
	return 0;
}
/by Logic
#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn=130050,maxm=2050;
struct Tree
{
	int fa,l,r,key,siz;
	bool re;
}tree[maxn];
int n,m,root=1,now=0;
void get_size(int x)
{
	tree[x].siz=tree[tree[x].l].siz+tree[tree[x].r].siz+1;
}
void build(int fa,int cur,int le,int ri)
{
	tree[cur].fa=fa;
	tree[cur].key=(le+ri)/2;
	tree[cur].re=0;
	if(le>=tree[cur].key) tree[cur].l=0;
	else
	{
		tree[cur].l=now+1;
		build(cur,++now,le,tree[cur].key-1);
	}
	if(ri<=tree[cur].key) tree[cur].r=0;
	else
	{
		tree[cur].r=now+1;
		build(cur,++now,tree[cur].key+1,ri);
	}
	get_size(cur);
}
void update(int x)
{
	if(!x||!tree[x].re) return ;
	tree[x].re=0;
	tree[tree[x].l].re=!tree[tree[x].l].re;
	tree[tree[x].r].re=!tree[tree[x].r].re;
	swap(tree[x].l,tree[x].r);
}
void print(int x)
{
	update(x);
	if(tree[x].l) print(tree[x].l);
	if(tree[x].key&&tree[x].key<=n) printf("%d ",tree[x].key);
	if(tree[x].r) print(tree[x].r);
}
void rot(int x)
{
	int fa=tree[x].fa;
	update(tree[fa].fa);
	update(fa);
	update(x);
	if(tree[fa].l==x)
	{
		tree[fa].l=tree[x].r;
		if(tree[x].r) tree[tree[x].r].fa=fa;
		tree[x].r=fa;
	}
	else
	{
		tree[fa].r=tree[x].l;
		if(tree[x].l) tree[tree[x].l].fa=fa;
		tree[x].l=fa;
	}
	if(root==fa) root=x;
	else if(tree[tree[fa].fa].l==fa) tree[tree[fa].fa].l=x;
	else tree[tree[fa].fa].r=x;
	tree[x].fa=tree[fa].fa;
	tree[fa].fa=x;
	get_size(fa);
	get_size(x);
}
void splay(int x,int c)
{
	int y=tree[x].fa,z=tree[tree[x].fa].fa;
	if((!c&&y==root)||(c&&z==root)) rot(x);
	else if((tree[z].l==y)^(tree[y].l==x)) rot(x),rot(x);
	else rot(y),rot(x);
}
void reverse(int l,int r)
{
	int i;
	update(root);
	for(l++,i=root;l!=tree[tree[i].l].siz+1;)
	{
		if(l<=tree[tree[i].l].siz) i=tree[i].l;
		else l-=tree[tree[i].l].siz+1,i=tree[i].r;
		update(i);
	}
	while(i!=root) splay(i,0);
	for(r++,i=root;r!=tree[tree[i].l].siz+1;)
	{
		if(r<=tree[tree[i].l].siz) i=tree[i].l;
		else r-=tree[tree[i].l].siz+1,i=tree[i].r;
		update(i);
	}
	while(tree[i].fa!=root) splay(i,1);
	tree[tree[i].l].re=!tree[tree[i].l].re;
}
int main()
{
#ifndef ONLINE_JUDGE
	freopen("data.in","r",stdin);
	//freopen("data.out","w",stdout);
#endif
	int i,l,r;
	scanf("%d%d",&n,&m);
	tree[0].siz=0;
	build(0,++now,0,n+1);
	for(i=0;i<m;i++)
	{
		scanf("%d%d",&l,&r);
		reverse(l-1,r+1);
		//print(root),printf("\n");
	}
	print(root);
	return 0;
}
个人工具