zoukankan      html  css  js  c++  java
  • hdu 3487

    splay

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define maxn 300009
    #define lch(rt) son[rt][0]
    #define rch(rt) son[rt][1]
    using namespace std;
    
    int son[maxn][2],fa[maxn],size[maxn],val[maxn],st[maxn];
    int root,cnt;
    int num[maxn],flg[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])
        {
            int tmp=rch(rt);
            rch(rt)=lch(rt);
            lch(rt)=tmp;
            if(rch(rt))
                flg[rch(rt)]^=1;
            if(lch(rt))
                flg[lch(rt)]^=1;
            flg[rt]=0;
        }
    }
    
    void newnode(int &rt,int f,int v)
    {
        rt=++cnt;
        rch(rt)=lch(rt)=0;
        fa[rt]=f;
        val[rt]=v;
        size[rt]=1;
        flg[rt]=0;
    }
    
    void build(int l,int r,int &rt,int f)
    {
        if(l>r)return;
        int m=(l+r)>>1;
        newnode(rt,f,num[m]);
        build(l,m-1,lch(rt),rt);
        build(m+1,r,rch(rt),rt);
        push_up(rt);
    }
    
    void ini()
    {
        lch(0)=rch(0)=0;
        fa[0]=size[0]=val[0]=0;
        root=0;
        cnt=0;
        newnode(root,0,0);
        newnode(rch(root),root,n+1);
        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;
    }
    
    void cut(int a,int b,int c)
    {
        a=select(a-1);
        splay(a,0);
        b=select(b+1);
        splay(b,a);
        int res=lch(b);
        lch(b)=0;
        push_up(b);push_up(a);
        a=select(c);b=select(c+1);
        splay(a,0);splay(b,a);
        lch(b)=res;
        fa[res]=b;
    }
    
    void flip(int a,int b)
    {
        a=select(a-1);
        splay(a,0);
        b=select(b+1);
        splay(b,a);
        flg[lch(b)]^=1;
    }
    
    int cot=1;
    void dfs(int rt)
    {
        push_down(rt);
        if(lch(rt))
            dfs(lch(rt));
        if(val[rt]>0&&val[rt]<=n&&cot<n)
        {
            printf("%d ",val[rt]);
            cot++;
        }
        else if(val[rt]>0&&val[rt]<=n&&cot==n)
        {
            printf("%d",val[rt]);
        }
        if(rch(rt))
            dfs(rch(rt));
    }
    
    char s[10];
    
    int main()
    {
        for(int i=1; i<maxn; i++)
            num[i]=i;
        while(scanf("%d%d",&n,&m)&&n>0)
        {
    
            ini();
            int a,b,c;
            while(m--)
            {
                scanf("%s",s);
                if(s[0]=='C')
                {
                    scanf("%d%d%d",&a,&b,&c);
                    cut(a+1,b+1,c+1);
                }
                else
                {
                    scanf("%d%d",&a,&b);
                    flip(a+1,b+1);
                }
            }
            cot=1;
            a=select(2);b=select(n+1);
            splay(a,0);splay(b,a);
            dfs(root);
            puts("");
        }
        return 0;
    }
    View Code
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define maxn 300009
    #define lch(rt) son[rt][0]
    #define rch(rt) son[rt][1]
    using namespace std;
    
    int son[maxn][2],fa[maxn],size[maxn],val[maxn],st[maxn];
    int root,cnt;
    int num[maxn],flg[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])
        {
            int tmp=rch(rt);
            rch(rt)=lch(rt);
            lch(rt)=tmp;
            flg[rch(rt)]^=1;
            flg[lch(rt)]^=1;
            flg[rt]=0;
        }
    }
    
    void newnode(int &rt,int f,int v)
    {
        rt=++cnt;
        rch(rt)=lch(rt)=0;
        fa[rt]=f;
        val[rt]=v;
        size[rt]=1;
        flg[rt]=0;
    }
    
    void build(int l,int r,int &rt,int f)
    {
        if(l>r)return;
        int m=(l+r)>>1;
        newnode(rt,f,num[m]);
        build(l,m-1,lch(rt),rt);
        build(m+1,r,rch(rt),rt);
        push_up(rt);
    }
    
    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的右子节点
    {
        push_down(rt);
        while(fa[rt]!=goal)
        {
            int y=fa[rt];
            if(fa[y]==goal)
                rotate(rt,son[y][0]==rt);
            else
            {
                int kind=son[fa[y]][0]==y;
                if(son[y][kind]==rt)
                {
                    rotate(rt,kind^1);
                    rotate(rt,kind);
                }
                else
                {
                    rotate(y,kind);
                    rotate(rt,kind);
                }
            }
        }
        push_up(rt);
        if(goal==0) root=rt;
    }
    
    int select(int k)
    {
        int rt=root;
        while(size[lch(rt)]!=k)
        {
            if(size[lch(rt)]>k)
                rt=lch(rt);
            else
            {
                k-=(size[lch(rt)]+1);
                rt=rch(rt);
            }
            push_down(rt);
        }
        return rt;
    }
    
    void rotate_to(int k,int goal)//将第k节点旋转到goal的右儿子节点;
    {
        int rt=root;
        rt=select(k);
        splay(rt,goal);
    }
    
    void cut(int a,int b,int c)
    {
        rotate_to(a-1,0);
        rotate_to(b+1,root);
        int x=rch(root);
        int tmp=lch(x);
        lch(x)=0;
        push_up(x);
        push_up(root);
        rotate_to(c,0);
        rotate_to(c+1,root);
        fa[tmp]=rch(root);
        lch(rch(root))=tmp;
        push_up(rch(root));
        push_up(root);
    }
    
    void flip(int a,int b)
    {
        rotate_to(a-1,0);
        rotate_to(b+1,root);
        flg[lch(rch(root))]^=1;
    }
    
    void dfs(int rt)
    {
        push_down(rt);
        if(lch(rt))
            dfs(lch(rt));
        if(val[rt]!=0)
        printf(" %d",val[rt]);
        if(rch(rt))
            dfs(rch(rt));
    }
    
    void ini()
    {
        lch(0)=rch(0)=0;
        fa[0]=size[0]=0;
        root=0;
        cnt=0;
        newnode(root,0,0);
        newnode(rch(root),root,0);
        push_up(root);
        build(1,n,lch(rch(root)),rch(root));
        push_up(rch(root));
        push_up(root);
    }
    
    char s[10];
    
    int main()
    {
        while(scanf("%d%d",&n,&m)&&n>0)
        {
            for(int i=1; i<=n; i++)
                num[i]=i;
            ini();
            int a,b,c;
            while(m--)
            {
                scanf("%s",s);
                if(s[0]=='C')
                {
                    scanf("%d%d%d",&a,&b,&c);
                    cut(a,b,c);
    //                rotate_to(1,0);
    //                printf("%d",val[root]);
    //                dfs(rch(root));
    //                puts("");
                }
                else
                {
                    scanf("%d%d",&a,&b);
                    flip(a,b);
                }
            }
            rotate_to(1,0);
            printf("%d",val[root]);
            dfs(rch(root));
            puts("");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    go引入包一直是红色,没有引入的解决办法
    php 把抛出错误记录到日志中
    亚马逊查询接口
    git 合并指定文件到另一个分支
    content-type
    Echarts(饼图Pie)
    DIN 模型速记
    DeepFM 要点速记
    youtube DNN 模型要点速记
    java设计模式之迭代器
  • 原文地址:https://www.cnblogs.com/yours1103/p/3599420.html
Copyright © 2011-2022 走看看