zoukankan      html  css  js  c++  java
  • 小C的树(Treap节点删除)[70/100]



    用Treap暴力模拟,调常数~

    好了,接下来说一下Treap中的删除操作

    Step 1:先找到这个结点。

    Step 2:如果它的儿子≤1,用它儿子替它

                否则 把之后做根节点的儿子旋转到根

                回到Step 1.


    居然不会……我可以去面壁了……

    话说更新Blog真是开心(蒟蒻的Blog几近没人看)

    膜拜自建站的。

    //话说跑题了啊……%


    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<functional>
    #include<iostream>
    #include<cmath>
    #include<cctype>
    #include<ctime>
    using namespace std;
    #define For(i,n) for(int i=1;i<=n;i++)
    #define Fork(i,k,n) for(int i=k;i<=n;i++)
    #define Rep(i,n) for(int i=0;i<n;i++)
    #define ForD(i,n) for(int i=n;i;i--)
    #define RepD(i,n) for(int i=n;i>=0;i--)
    #define Forp(x) for(int p=pre[x];p;p=next[p])
    #define Lson (x<<1)
    #define Rson ((x<<1)+1)
    #define MEM(a) memset(a,0,sizeof(a));
    #define MEMI(a) memset(a,127,sizeof(a));
    #define MEMi(a) memset(a,128,sizeof(a));
    #define INF (2139062143)
    #define F (100000007)
    #define MAXN (200000+10)
    long long mul(long long a,long long b){return (a*b)%F;}
    long long add(long long a,long long b){return (a+b)%F;}
    long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
    struct node
    {
        int ch[2],v,r;
        node():v(0),r(0){ch[0]=ch[1]=0;}
        node(int _v,int _r):v(_v),r(_r){ch[0]=ch[1]=0;}
    }q[MAXN];
    int root=0,tail=0;
    void rotate(int &x,int p)
    {
        int y=q[x].ch[p^1];q[x].ch[p^1]=q[y].ch[p];q[y].ch[p]=x;x=y;
    }
    void insert(int &x,int p)
    {
        if (!x) {x=p;return;}
        bool p2=q[p].v>q[x].v;
        insert(q[x].ch[p2],p);
        if (q[x].r<q[q[x].ch[p2]].r) rotate(x,p2^1);
    }
    void delet(int &x,int v)
    {
    	if (!x) return;
        if (q[x].v==v)
        {
            int y1=q[x].ch[0],y2=q[x].ch[1];
            if (!y1&&!y2) {x=0;return;}
            if (y1&&!y2) {x=q[x].ch[0];return;}
            if (!y1&&y2) {x=q[x].ch[1];return;}
    		int p=q[y2].r>q[y1].r,y=q[x].ch[p];
            /*
    		swap(q[x].v,q[y].v);swap(q[x].r,q[y].r);
            delet(y,v);*/
            rotate(x,p^1);
            delet(x,v);
        }
        if (v<q[x].v) delet(q[x].ch[0],v);
        else delet(q[x].ch[1],v);
    }
    int find(int x,bool is_d,int u,int v)
    {
        int ans=0;
        if (!is_d)
        {
            if (q[x].v==u) return find(x,1,v,0);
            if (q[x].v==v) return find(x,1,u,0);
            int p1=u>q[x].v,p2=v>q[x].v;
            if (p1==p2) return find(q[x].ch[p1],0,u,v);
            else return 2+find(q[x].ch[p1],1,u,0)+find(q[x].ch[p2],1,v,0);
        }
        else
        {
            if (q[x].v==u) return 0;
            int p=u>q[x].v;
            return 1+find(q[x].ch[p],1,u,0);
        }
    }
    int m;
    int main()
    {
    	freopen("c.in","r",stdin);
    	freopen("c.out","w",stdout);
        scanf("%d",&m);
        For(i,m)
        {
            int p;
            scanf("%d",&p);
            if (p==0)
            {
                int v,r;
                scanf("%d%d",&v,&r);
                q[++tail]=node(v,r);
                insert(root,tail);
            }
            else if (p==1)
            {
                int v;
                scanf("%d",&v);
                delet(root,v);
            }
            else
            {
                int u,v;
                scanf("%d%d",&u,&v);
                if (u==v) puts("0");
                else cout<<find(root,0,u,v)<<endl;
            }
    
        }
    
    
    	return 0;
    }






  • 相关阅读:
    git简单介绍
    ssh常用操作
    gentoo emerge简单用法
    golang程序因未知错误崩溃时如何记录异常
    RPC实现原理(HSF、dubbo) 从头开始(一)
    websocket
    tmpfs小结
    CURL常用命令
    SVN命令详解
    3.Linux Shell流程控制
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3172252.html
Copyright © 2011-2022 走看看