• 二叉查找树(平衡树的根源)


    #include<bits/stdc++.h>
    using namespace std;
    const int N=100010;
    int root,tot;
    int sz[N],val[N],ch[N][2],fa[N];
    void pushup(int x){
    	if(!x)return;
        sz[x]=1;
    	if(ch[x][0])sz[x]+=sz[ch[x][0]],fa[ch[x][0]]=x;
        if(ch[x][1])sz[x]+=sz[ch[x][1]],fa[ch[x][1]]=x;
    }
    void insert(int &rt,int v){
        if(!rt){
            rt=++tot;
            val[rt]=v;
            ch[rt][0]=ch[rt][1]=0;
            sz[rt]=1;
            return;
    	}
    	if(v>val[rt])insert(ch[rt][1],v);
    	else insert(ch[rt][0],v);
    	pushup(rt);
    }
    int erased;
    void erasesuc(int&rt){
        if(ch[rt][0]){
            erasesuc(ch[rt][0]);
    	}else{
    		erased=val[rt];
    	    rt=ch[rt][1];
    	    return;
    	}
    	pushup(rt);
    }
    void erase(int&rt,int v){
        if(val[rt]==v){
            if(!ch[rt][0]||!ch[rt][1]){
    		    rt=ch[rt][0]+ch[rt][1];
    		}else{
    			erasesuc(ch[rt][1]);
    			val[rt]=erased;
    		}
    		pushup(rt);
    		return;
    	}
    	if(v<val[rt])erase(ch[rt][0],v);
    	else erase(ch[rt][1],v);
    	pushup(rt);
    }
    int rnk(int rt,int x){
    	if(!rt)return 0;
        if(x<=val[rt])return rnk(ch[rt][0],x);
        else return sz[ch[rt][0]]+1+rnk(ch[rt][1],x);
    }
    int kth(int rt,int x){
        if(x<=sz[ch[rt][0]])return kth(ch[rt][0],x);
        else if(x==sz[ch[rt][0]]+1)return val[rt];
        else return kth(ch[rt][1],x-sz[ch[rt][0]]-1);
    }
    int pre(int x){
        return kth(root,rnk(root,x));
    }
    int suc(int x){
        return kth(root,rnk(root,x+1)+1);
    }
    void print(int rt){
        if(!rt)return;
        print(ch[rt][0]);
        printf("%d ",val[rt]);
        print(ch[rt][1]);
    //    pushup(rt);
    }
    int main(){
    	freopen("1.in","r",stdin);
    	int n;
        cin>>n;
        while(n--){
            int op,x;
            scanf("%d%d",&op,&x);
            if(op==1){
                insert(root,x);
    		}else if(op==2){
    		    erase(root,x);
    		}else if(op==3){
    		    printf("%d
    ",rnk(root,x)+1);
    		}else if(op==4){
    			printf("%d
    ",kth(root,x));
    		}else if(op==5){
    			printf("%d
    ",pre(x));
    		}else {
    			printf("%d
    ",suc(x));
    		}
    //		print(root),puts("");
    	}
    }
    
  • 相关阅读:
    php解析文本文件呈现在表格上
    nyoj 1058部分和问题
    nyoj 488素数环
    nyoj 82迷宫寻宝(一)
    nyoj58最少步数
    nyoj 325 zb的生日
    nyoj 20 吝啬的国度
    nyoj 349 Sorting It All Out
    nyoj 284
    PPT基础整理
  • 原文地址:https://www.cnblogs.com/zhenglier/p/11228388.html
Copyright © 2020-2023  润新知