zoukankan      html  css  js  c++  java
  • 平衡树-初步总结

    这是一个还没有来得及填的坑……等我丢个带旋的treap代码在这里###

    可能会过几(hen)天(jiu)才写

    • 带旋treap代码:(洛谷P3369【模板】普通平衡树)
    #include<bits/stdc++.h>
    #define grbv GetRankByVal
    #define gvbr GetValByRank
    using namespace std;
    const int size=100010;
    struct treap{
    	int l,r;
    	int val,dat;
    	int cnt,size;
    }a[size];
    int tot,root,n,inf=0x7fffffff;
    
    inline int read(){
    	int cn=0,f=1;char c;
    	c=getchar();
    	while(!isdigit(c)){
    		if(c=='-')f=-1;
    		c=getchar();
    	}
    	while(isdigit(c)){
    		cn=cn*10+c-'0';
    		c=getchar();
    	}
    	return cn*f;
    }
    
    int New(int val){
    	a[++tot].val=val;
    	a[tot].dat=rand();
    	a[tot].cnt=a[tot].size=1;
    	return tot;
    }
    
    inline void update(int p){
    	a[p].size=a[a[p].l].size+a[a[p].r].size+a[p].cnt;
    }
    
    void build_tree(){
    	New(-inf),New(inf);
    	root=1,a[1].r=2;
    	update(root);
    }
    
    int grbv(int p,int val){
    //	if(p==0) return 0;
    	if(val==a[p].val) return a[a[p].l].size+1;
    	if(val<a[p].val)return grbv(a[p].l,val);
    	return grbv(a[p].r,val)+a[a[p].l].size+a[p].cnt;
    }
    
    int gvbr(int p,int rank){
    //	if(p==0) return inf;
    	if(a[a[p].l].size>=rank) return gvbr(a[p].l,rank);
    	if(a[a[p].l].size+a[p].cnt>=rank) return a[p].val;
    	return gvbr(a[p].r,rank-a[a[p].l].size-a[p].cnt);
    }
    
    void zig(int &p){
    	int q=a[p].l;
    	a[p].l=a[q].r,a[q].r=p,p=q;
    	update(a[p].r),update(p);
    }
    
    void zag(int &p){
    	int q=a[p].r;
    	a[p].r=a[q].l,a[q].l=p,p=q;
    	update(a[p].l),update(p);
    }
    
    void insert(int &p,int val){
    	if(p==0){
    		p=New(val);
    		return;
    	}
    	if(val==a[p].val){
    		a[p].cnt++,update(p);
    		return;
    	}
    	if(val<a[p].val){
    		insert(a[p].l,val);
    		if(a[p].dat<a[a[p].l].dat) zig(p);
    	}
    	else{
    		insert(a[p].r,val);
    		if(a[p].dat<a[a[p].r].dat)zag(p);
    	}
    	update(p);
    }
    
    int get_pre(int val){
    	int ans=1;//a[1].val==-inf
    	int p=root;
    	while(p){
    		if(val==a[p].val){
    	 		if(a[p].l>0){
    	 			p=a[p].l;
    	 			while(a[p].r>0) p=a[p].r;
    	 			ans=p;
    	 		}
    	 		break;
    	 	}
    	 	if(a[p].val<val&&a[p].val>a[ans].val) ans=p;
    	 	p=val<a[p].val?a[p].l:a[p].r;
    	 }
    	 return a[ans].val;
    }
    
    int get_next(int val){
    	int ans=2;// a[2].val==inf
    	int p=root;
    	while(p){
    		if(val==a[p].val){
    			if(a[p].r>0){
    				p=a[p].r;
    				while(a[p].l>0) p=a[p].l;
    				ans=p;
    			}
    			break;
    		}
    		if(a[p].val>val&&a[p].val<a[ans].val) ans=p;
    		p=val<a[p].val?a[p].l:a[p].r;
    	}
    	return a[ans].val;
    }
    
    void remove(int &p,int val){
    	if(p==0)return;
    	if(val==a[p].val){
    		if(a[p].cnt>1){
    			a[p].cnt--,update(p);
    			return;
    		}
    		if(a[p].l||a[p].r){
    			if(a[p].r==0||a[a[p].l].dat>a[a[p].r].dat)
    				zig(p),remove(a[p].r,val);
    			else
    				zag(p),remove(a[p].l,val);
    			update(p);
    		}
    		else p=0;
    		return;
    	}
    	val<a[p].val?remove(a[p].l,val):remove(a[p].r,val);
    	update(p);
    }
    
    int main(){
    	build_tree();
    	n=read();
    	srand(n);
    	while(n--){
    		int opt,x;
    		opt=read();x=read();
    		if(opt==1)
    			insert(root,x);
    		if(opt==2)
    			remove(root,x);
    		if(opt==3)
    			printf("%d
    ",grbv(root,x)-1);
    		if(opt==4)
    			printf("%d
    ",gvbr(root,x+1));
    		if(opt==5)
    			printf("%d
    ",get_pre(x));
    		if(opt==6)
    			printf("%d
    ",get_next(x));
    	}
    	return 0;
    } 
    
    
  • 相关阅读:
    CF1202F You Are Given Some Letters...
    CF1178E Archaeology
    PTA (Advanced Level) 1005 Spell It Right
    PTA (Advanced Level) 1004 Counting Leaves
    Qt5——从零开始的Hello World教程(Qt Creator)
    PTA (Advanced Level) 1003 Emergency
    PTA (Advanced Level) 1002 A+B for Polynomials
    HDU 1272 小希的迷宫
    FZU 2150 Fire Game
    HihoCoder
  • 原文地址:https://www.cnblogs.com/kma093/p/9741457.html
Copyright © 2011-2022 走看看