现在的位置: 首页 > 综合 > 正文

UVA 11922 Permutation Transformer SPLAY 区间分裂,曲间插入

2013年04月27日 ⁄ 综合 ⁄ 共 3454字 ⁄ 字号 评论关闭

SPLAY水题。和HDU上那题一样的操作。。。。复习一下SPLAY,,,UVA提交返回结果好慢。。。等了5分多钟啊。。。。在UVA上面Verdict里是空着的。。。不知道为什么。但在虚拟OJ上面提交过了,返回结果巨慢。。一直processing太奇怪了

 

题目地址:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3073

 

#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cstdio>

using namespace std;

#define MAXN 250000

int next[MAXN];
struct nodes
{
    int ch[2],f;
    int key,size,w,col;
}node[MAXN];

void init()
{
    for(int i=0;i<MAXN-10;i++)
        next[i]=i+1;
}

int newnode(int key)
{
    int p=next[0];
    next[0]=next[p];
    node[p].key=key;
    node[p].w=node[p].size=1;
    node[p].col=0;
    node[p].ch[0]=node[p].ch[1]=node[p].f=0;
    return p;
}

void delnode(int p)
{
    next[p]=next[0];
    next[0]=p;
}

struct spt
{
    int root;

    void clear()
    {
        root=0;
    }
    void rotate(int x,int c)
    {
        int y=node[x].f;
        push_down(y);push_down(x);
        node[y].ch[!c]=node[x].ch[c];
        if(node[x].ch[c])
                node[node[x].ch[c]].f=y;
        node[x].f=node[y].f;
        if(node[y].f)
        {
            if(node[node[y].f].ch[0]==y)
                node[node[y].f].ch[0]=x;
            else
                node[node[y].f].ch[1]=x;
        }
        node[x].ch[c]=y;
        node[y].f=x;
        push_up(y);
        if(y==root) root=x;
    }
    void splay(int x,int f)
    {
        push_down(x);
        for(;node[x].f!=f;)
        {
            push_down(node[node[x].f].f);
            push_down(node[x].f);
            push_down(x);
            if(node[node[x].f].f==f)
            {
                if(node[node[x].f].ch[0]==x)
                    rotate(x,1);
                else
                    rotate(x,0);
            }
            else
            {
                int y=node[x].f;
                int z=node[y].f;
                if(node[z].ch[0]==y)
                {
                    if(node[y].ch[0]==x)
                        rotate(y,1),rotate(x,1);
                    else
                        rotate(x,0),rotate(x,1);
                }
                else
                {
                    if(node[y].ch[1]==x)
                        rotate(y,0),rotate(x,0);
                    else
                        rotate(x,1),rotate(x,0);
                }
            }
        }
        push_up(x);
        if(!f) root=x;
    }
    void split(int l,int r,int &s2)
    {
        select(l,0);
        select(r+2,root);
        int tmp=node[node[root].ch[1]].ch[0];
        node[node[root].ch[1]].ch[0]=0;
        push_up(node[root].ch[1]);
        push_up(root);
        s2=tmp;
    }
    void reverse(int l,int r)
    {
        select(l,0);
        select(r+2,root);
        node[node[node[root].ch[1]].ch[0]].col^=1;
    }
    int select(int k,int rt)
    {
        int tmp,t=root;
        for(;;)
        {
            push_down(t);
            int l=node[node[t].ch[0]].size;
            if(k>l && k<=l+node[t].w) break;
            if(k<=l)
                t=node[t].ch[0];
            else
                k-=(l+node[t].w),t=node[t].ch[1];
        }
        splay(t,rt);
        return t;
    }

    int getmin(int p)
    {
        push_down(p);
        while(node[p].ch[0])
        {
            p=node[p].ch[0];
            push_down(p);
        }
        return p;
    }

    int getmaxn(int p)
    {
        push_down(p);
        while(node[p].ch[1])
        {
            p=node[p].ch[1];
            push_down(p);
        }
        return p;
    }

    void push_down(int rt)
    {
        if(rt && node[rt].col)
        {
            swap(node[rt].ch[0],node[rt].ch[1]);
            int l=node[rt].ch[0];
            int r=node[rt].ch[1];
            node[l].col^=1;
            node[r].col^=1;
            node[rt].col=0;
        }
    }


    void push_up(int rt)
    {
        if(!rt)return;
        int l=node[rt].ch[0];
        int r=node[rt].ch[1];
        int ret=node[rt].w;
        if(l) ret+=node[l].size;
        if(r) ret+=node[r].size;
        node[rt].size=ret;
    }
     void del(int p)
    {
        if(!p) return;
        del(node[p].ch[0]);
        del(node[p].ch[1]);
        delnode(p);
    }

    int build(int l,int r,int f)
    {

        if(l>r) return 0;
        int m=(l+r)>>1;
        int p=newnode(m);
        node[p].f=f;
        node[p].ch[0]=build(l,m-1,p);
        node[p].ch[1]=build(m+1,r,p);
        push_up(p);
        return p;
    }

    void cut(int a,int b,int c)
    {
        spt tmp;
        split(a,b,tmp.root);
        select(c+1,0);
        c=getmin(node[root].ch[1]);
        splay(c,root);
        node[node[root].ch[1]].ch[0]=tmp.root;
        node[tmp.root].f=c;
        push_up(node[root].ch[1]);
        push_up(root);
    }
};
spt s1;
int n,m;

void out(int p)
{
    if(!p)
        return;
    else
    {
        s1.push_down(p);
        out(node[p].ch[0]);
        if(node[p].key!=n+1 && node[p].key!=0)printf("%d\n",node[p].key);
        out(node[p].ch[1]);
    }
}

void prepare()
{
    s1.clear();
    s1.root=newnode(0);
    node[s1.root].ch[1]=newnode(n+1);
    node[node[s1.root].ch[1]].f=s1.root;
    node[node[s1.root].ch[1]].ch[0]=s1.build(1,n,node[s1.root].ch[1]);
    s1.push_up(node[s1.root].ch[1]);
    s1.push_up(s1.root);
}

int main()
{
    init();
    while(~scanf("%d%d",&n,&m))
    {
        prepare();
        int a,b;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&a,&b);
            if(b<a) swap(a,b);
            int e=n-(b-a+1);
            s1.reverse(a,b);
            s1.cut(a,b,e);
        }
        out(s1.root);
        s1.del(s1.root);
    }
    return 0;
}

 

 

抱歉!评论已关闭.