hdu 4286

splay 练手用;

杭电的oj要手动开栈;

#include<cstdio>
#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstring>
#include<algorithm>
#define inf 999999
#define maxn 1500009
#define lch(rt) son[rt][0]
#define rch(rt) son[rt][1]
using namespace std;

int son[maxn][2],fa[maxn];
int val[maxn],size[maxn],flg[maxn];
int cnt,root;
int num[maxn];
int n,m;

void push_up(int rt)
{
    size[rt]=size[lch(rt)]+size[rch(rt)]+1;
}

void push_down(int rt)
{
    if(flg[rt])
    {
        swap(lch(rt),rch(rt));
        if(lch(rt))
            flg[lch(rt)]^=1;
        if(rch(rt))
            flg[rch(rt)]^=1;
        flg[rt]=0;
    }
}

void newnode(int &rt,int f,int v)
{
    rt=++cnt;
    lch(rt)=rch(rt)=0;
    val[rt]=v;
    fa[rt]=f;
    size[rt]=1;
    flg[rt]=0;
}

void build(int l,int r,int &rt,int f)
{
    if(l>r)return;
    int mid=(l+r)>>1;
    newnode(rt,f,num[mid]);
    build(l,mid-1,lch(rt),rt);
    build(mid+1,r,rch(rt),rt);
    push_up(rt);
}

void ini()
{
    cnt=root=0;
    lch(0)=rch(0)=0;
    fa[0]=val[0]=flg[0]=size[0]=0;
    newnode(root,0,0);
    newnode(rch(root),root,inf);
    build(1,n,lch(rch(root)),rch(root));
    push_up(rch(root));
    push_up(root);
}

void rotate(int x,int kind)//0->left,1->right
{
    push_down(x);
    int y=fa[x];
    son[y][kind^1]=son[x][kind];
    fa[son[x][kind]]=y;
    if(fa[y])
        son[fa[y]][son[fa[y]][1]==y]=x;
    fa[x]=fa[y];
    son[x][kind]=y;
    fa[y]=x;
    push_up(y);
}

void splay(int rt,int goal)//将rt节点旋转到goal的右子节点
{
    if(rt!=goal)
    {
        push_down(rt);
        while(fa[rt]!=goal)
        {
            if(lch(fa[rt])==rt)
                rotate(rt,1);
            else rotate(rt,0);
        }
        push_up(rt);
        if(!goal)root=rt;
    }
}

int select(int k)
{
    int rt=root;
    push_down(rt);
    while(size[lch(rt)]+1!=k)
    {
        if(size[lch(rt)]+1>=k)
            rt=lch(rt);
        else
        {
            k-=(size[lch(rt)]+1);
            rt=rch(rt);
        }
        push_down(rt);//不加就超时;
    }
    return rt;
}

int cntt;
void dfs(int rt)
{
    push_down(rt);
    if(lch(rt))
        dfs(lch(rt));
    num[cntt++]=val[rt];
    if(rch(rt))
        dfs(rch(rt));
}

void flip(int a,int b)
{
    a=select(a-1);
    splay(a,0);
    b=select(b+1);
    splay(b,a);
    flg[lch(b)]^=1;
}

char s[20],t[5];

int main()
{
    int tt;
    int ld,rd;
    scanf("%d",&tt);
    while(tt--)
    {
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
            scanf("%d",&num[i]);
        ini();
        scanf("%d%d",&ld,&rd);
        ld++;
        rd++;
        int cot=0;
        int a,b;
        scanf("%d",&m);
        int dat;
        while(m--)
        {
            scanf("%s",s);
            if(s[0]=='M')
            {
                scanf("%s",t);
                if(t[0]=='R'&&s[4]=='R')
                    rd++;
                else if(t[0]=='R'&&s[4]=='L')
                    rd--;
                else if(t[0]=='L'&&s[4]=='R')
                    ld++;
                else ld--;
            }
            else if(s[0]=='I')
            {
                cot++;
                scanf("%s%d",t,&dat);
                if(t[0]=='L')
                {
                    a=select(ld-1);
                    b=select(ld);
                }
                else
                {
                    a=select(rd);
                    b=select(rd+1);
                }
                rd++;
                splay(a,0);
                splay(b,a);
                newnode(lch(b),b,dat);
                fa[lch(b)]=b;
                push_up(b);
                push_up(a);
            }
            else if(s[0]=='R')
            {
                flip(ld,rd);
            }
            else if(s[0]=='D')
            {
                cot--;
                scanf("%s",t);
                if(t[0]=='L')
                {
                    a=select(ld-1);
                    b=select(ld+1);
                }
                else
                {
                    a=select(rd-1);
                    b=select(rd+1);
                }
                rd--;
                splay(a,0);
                splay(b,a);
                push_down(a);
                push_down(b);
                lch(b)=0;
                push_up(b);
                push_up(a);
            }
        }
        a=select(2);
        b=select(n+cot+1);
        splay(a,0);
        splay(b,a);
        n+=cot;
        cntt=0;
        dfs(root);
        for(int i=1;i<n;i++)
            printf("%d ",num[i]);
        printf("%d
",num[n]);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/yours1103/p/3600636.html