zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    bug的约束
    bug管理规范
    FTP小教程
    测试需求,产品需求,项目需求
    如何理解客户需求、市场需求、产品需求、业务需求、特性、功能需求 ?(转)
    什么是测试需求?(转)
    绑定与非绑定,反射,内置方法
    面向对象之组合、封装、多态、property装饰器
    面向对象之继承与派生,属性查找
    面向对象基础
  • 原文地址:https://www.cnblogs.com/mybing/p/8429969.html
Copyright © 2011-2022 走看看