zoukankan      html  css  js  c++  java
  • AVL

    struct AVLNode{
    	AVLNode *kid[2],*pa;
    	int val,cnt;
    	int flag;
    	AVLNode():kid[0](NULL),kid[0](NULL),pa(NULL),flag(0){}
    }*root,*nil;
    void Rotate(AVLNode *node,int drct){
    	AVLNode *t=node->kid[1-drct];
    	node->kid[1-drct]->kid[drct]->pa=node;
    	node->kid[1-drct]=node->kid[1-drct]->kid[drct];
    	p->pa=node->pa;
    	if(p->pa->kid[0]==node) p->pa->kid[0]=p;
    	else p->pa->kid[1]=p;
    	node->pa=p;
    	p->kid[drct]=node;
    }
    void Insert(AVLNode *root,int val){
    	if(root==NULL){
    		root=new AVLNode();
    		root->val=val;
    		return;
    	}
    	AVLNode *p=root;
    	while(val<p->val && p->lhd!=NULL) p=p->lhd; 
    	while(val>p->val && p->rhd!=NULL) p=p->rhd;
    	if(val<p->val){ p->lhd=new AVLNode(); p->lhd->val=val; }
    	else if(val>p->val){ p->rhd=new AVLNode(); p->rhd->val=val; }
    	else p->cnt++;
    }
    void Query(AVLNode *root,int val){
    	AVLNode *p=root;
    	while(p->val!=val){
    		if(val<p->val){
    			if(p->lhd==NULL) return false;
    			p=p->lhd; continue;
    		}
    		if(val>p->val){
    			if(p->rhd==NULL) return false;
    			p=p->lhd; continue;
    		}  
    	}
    	return true;
    }
    void Delete(AVLNode *root,int val){
    	AVLNode *p=root;
    	while(p->val!=val){
    		if(val<p->val){
    			if(p->lhd==NULL) return false;
    			p=p->lhd; continue;
    		}
    		if(val>p->val){
    			if(p->rhd==NULL) return false;
    			p=p->lhd; continue;
    		}  
    	}
    	// ..............	
    }
    
    ////////////////
    	int gradir=(p->pa->chi[0])==p?0:1;
        node->pa=p; p->chi[dir]=node;
        p->bf+=(dir==0)?-1:1;
        while(p->bf){
            p->pa->bf+=(gradir==0)?-1:1;
            if(p->pa->bf==-2 || p->pa->bf==2 ){
                int rodir=(p->pa->bf<0)?1:0;
                Rotate(p->pa->dir,rodir);
                p->chi[rodir]->bf+=(rodir==1)?1:-1;
                p->bf+=(rodir==1)?1:-1;
            }else{ p=p->pa; }
        }
    
    // http://acm.nankai.edu.cn/p1248.html
    #include<iostream>
    #include<string.h>
    #include<stdio.h>
    using namespace std;
    #define abs(x) (((x)<0)?(-x):(x))
    int flag=0;
    struct Int{
    	int size,saf,lazy;
    	Int():size{}
    	bool operator <(const & a) const
    	{ return saf<a.saf; }
    	bool operator ==(const & a) const
    	{ return saf==a.saf; }
    };
    struct AVLNode{
        AVLNode *chi[2],*pa;
        Int val;
        int bf,cnt;
    }*nil=new AVLNode(),*root=nil;
    inline void Nil(){ nil->chi[0]=nil->chi[1]=nil->pa=nil; nil->bf=nil->cnt=0;}
    inline void CreatNode(AVLNode * &node,Int val,int cnt=1){
        if(node!=nil){ AVLNode *p=node; delete p; }
        node=new AVLNode(); node->val=val; node->cnt=cnt;
        node->pa=node->chi[0]=node->chi[1]=nil; node->bf=0;
    }
    inline void Connect(AVLNode *pa,AVLNode *node,int dir)
        { pa->chi[dir]=node; node->pa=pa; }
    AVLNode * Bound(AVLNode * root,Int val){
        AVLNode *p=root; if(root==nil) return nil;
        while(p!=nil && val!=p->val){
            int dir=(val<p->val);
            node=node->kid[drct];
        }
        return p;
    }
    AVLNode * Extrema(AVLNode * node,int dir){
        while(node->kid[dir]!=nil) node=node->chi[dir];
        return node;
    }
    BSTNode * Cessor(BSTNode * node,int dir){
        if(node->kid[dir]!=nil) return Extrema(node->chi[dir],1-dir);
        for(AVLnode * p=node->pa;p!=nil && p->chi[dir]==node;node=p,p=p->pa);
        return p;
    }
    void Rotate(AVLNode *node,int rodir){
        Nil(); AVLNode *pivot=node->chi[1-rodir];
        Connect(node,node->chi[1-rodir]->chi[rodir],1-rodir);
        Connect(node->pa,pivot,(node->pa->chi[0]==node)?0:1);
        Connect(pivot,node,rodir); Nil();
    	node->bf+=(rodir)?2:-2; pivot->bf+=(rodir)?1:-1;
    }
    AVLNode * Bound(AVLNode * node,Int val){
        if(node==nil) return nil;
        for(;val!=node->val;node=node->chi[dir]){
            int dir=(val<node->val)?0:1
            if(node->chi[dir]==nil) return node;
        }
        return node;
    }
    AVLNode * Search(AVLNode *root,int val){
        AVLNode *p=Bound(root,val);
        if(p->val==val) return p; return nil;
    }
    void Balance(AVLNode node,int dbf,int aimbf){
        while(abs(node->bf+=dbf)!=aimbf){
            if(abs(node->bf)==2){ 
    		int dir=(node->bf<0)?0:1;
    		if((node->bf)*(node->chi[dir]->bf)<0)
    			Rotate(node->chi[dir],dir)
    		Rotate(node,1-dir); node->pa->bf-=dbf; 
    	}
    	if(node=node->pa==nil) return;
        }
    }
    void Insert(AVLNode *root,Int val){
        if(root==nil){ CreatNode(root,val); return; }
        Nil(); AVLNode *p=Bound(root,val);
        if(p->val==val){ p->cnt++; return; }
        int dir=(val<p->val)?0:1; AVLNode *node;
        CreatNode(node,val); Connect(p,node,dir);
        Balance(p,(!dir)?-1:1,0);
    }
    bool Delete(AVLNode *root,int val){
        if(root==nil) return false; 
        Nil(); AVLNode *p=Search(root,val);
        if(p==nil) return false;
        if(p->cnt>1){ (p->cnt)--; return true; }
        if(p->chi[0]!=nil || p->chi[1]!=nil){
            AVLNode *suc=Cessor(p,1);
            if(suc==nil) suc=Cessor(p,0);
            p->val=suc->val; p=suc;
        }
    	int dir=p->pa->chi[0]==p?0:1;
        p->pa->chi[dir]=nil; 
        Balance(p->pa,(!dir)?1:-1,1); delete p;
    }
    void Depart(AVLNode *root,int min){
    }
    int main(){
    	int n,m;
    	scanf("%d%d",&n,&m);
    	while(n--){
    		char q; int a;
    		scanf("%c%d",&q,&a);
    		switch(c){
    			case 'I': a-=flag; if(a>=m) Insert(root,a); break;
    			case 'A': m+=a; flag+=a; break;
    			case 'S': m-=a; flag-=a; Depart(root,m); break;
    			case 'F': Query(root,a); break;
    		}
    	}
    	return 0;
    }
    
    AVLNode * Bound(AVLNode * root,Int val){
        if(root==nil) return nil;
        AVLNode *p=root; 
        while(p!=nil && val!=p->val){
            int dir=(val<p->val);
            p=p->chi[dir];
        }
        return p;
    }
    
    // A.myc 
    #include<iostream>  
    #include<string.h>  
    #include<stdio.h>  
    #include<string>  
    #include <stddef.h>  
    #include<queue> 
    #include<fstream>
    using namespace std; 
    int oo=0xffffffff; 
    int cnt=0;  
    #define abs(x) (((x)<0)?(-x):(x))  
    typedef string Int;  
    struct AVLNode{  
        AVLNode *chi[2],*pa;  
        Int val;  
        int bf,cnt;  
        int blank,len,hei; 
    }*nil=new AVLNode(),*root=nil;  
    inline void Nil(){ nil->chi[0]=nil->chi[1]=nil->pa=nil; nil->bf=nil->cnt=0; nil->blank=nil->len=nil->hei=0; }  
    void OutNode(AVLNode * node,int cor){ 
        for(int i=cor;i<node->blank;i++) printf(" "); 
        cout<<node->val; 
    } 
    int CalCor(AVLNode * root,int lst){
    	Nil(); root->blank=0;
    	root->len=root->val.length(); int dis=0,dis2=0;;
    	if(root->chi[0]!=nil){ root->chi[0]->hei=root->hei+1; dis=CalCor(root->chi[0],lst); }
    	int halflen=(root->len)/2;  root->blank=lst+dis-halflen; if(root->blank<lst) root->blank=lst;
    	if(root->chi[1]!=nil){ root->chi[1]->hei=root->hei+1; dis2=CalCor(root->chi[1],lst+dis+(dis?1:0)); }
    	if(!dis2) root->blank-=(root->len+1)/2;  if(root->blank<lst) root->blank=lst;
    	int ans=((dis+(dis?1:0)+dis2)>root->len)?dis+(dis?1:0)+dis2:root->len;
    	if(dis2 && dis && (root->chi[1]->blank-root->chi[0]->blank)>root->len && (root->chi[0]->blank+root->chi[1]->blank)/2+root->len<=ans) 
    		root->blank=(root->chi[0]->blank+root->chi[1]->blank)/2;
    	return ans; Nil();
    }
    
    /*int CalCor(AVLNode * root,int lst,int &padel,int dir){
    	Nil(); root->blank=0;
    	root->delta=0; root->len=root->val.length(); int dis=0,dis2=0;;
    	if(root->chi[0]!=nil){ root->chi[0]->hei=root->hei+1; dis=CalCor(root->chi[0],lst,root->delta,0); }
    	root->blank=dis+root->delta+lst;
    	if(root->chi[1]!=nil){ root->chi[1]->hei=root->hei+1; dis2=CalCor(root->chi[1],root->blank+root->len,root->delta,1); }
    	if(dis && dis2) root->delta/=2;  root->blank=dis+dis?(root->delta):0+lst;
    	if(!dir){ padel+=dis2+(dis2)?(root->delta):0+root->chi[1]->len; return root->blank+root->len-lst; }
    	else { padel+=root->blank-lst; return dis2+(dis2)?(root->delta):0+root->chi[1]->len; } Nil();
    }*/
    
    
    /*void CalCor(AVLNode *root,int cor,int lst,int &rst,int dir){ 
        root->len=root->val.length(); cor-=dir*root->len/2;  
        if(root->chi[0]!=nil){ CalCor(root->chi[0],cor,lst,root->blank,-1); root->chi[0]->hei=root->hei+1;} 
        if(lst<0){ cor-=lst; rst-=lst; root->blank-=lst; lst=0; } 
        cor+=root->len; if(cor>rst){ rst=cor; } 
        if(root->chi[1]!=nil){ CalCor(root->chi[1],cor,lst,root->blank,1); root->chi[1]->hei=root->hei+1; } 
    } */
    void OutTree(AVLNode * root){ 
        queue<AVLNode *> q; 
        q.push(root); int y=0,cor=0,cor2=0,cor3=0; string branch="",pro="";
        while(!q.empty()){ 
            AVLNode* t=q.front();  
            if(t->hei!=y) { cout<<endl<<pro<<endl<<branch; branch=""; pro=""; y=t->hei; printf("
    "); cor=0; cor2=0; cor3=0; } 
    		OutNode(t,cor); cor=t->blank+t->len;
    		for(int i=cor3;i<t->blank;i++) pro+=' '; cor3=t->blank;
    		switch(t->bf){
    			case -1: pro+="-1  "; cor3+=4; break;
    			case -2: pro+="-2  "; cor3+=4; break;
    			case 0:  pro+="0  "; cor3+=3; break;
    			case 1:  pro+="1  "; cor3+=3; break;
    			case 2:  pro+="2  "; cor3+=3; break;
    		}
    		if(t->chi[0]!=nil){ 
    			q.push(t->chi[0]); 
    			for(int i=cor2;i<(t->chi[0]->blank+t->blank)/2;i++) branch+=' '; 
    			branch+='/'; cor2=(t->chi[0]->blank+t->blank)/2; 
    
    		}
    		if(t->chi[1]!=nil){ 
    			q.push(t->chi[1]); 
    			for(int i=cor2;i<(t->chi[1]->blank+t->blank)/2;i++) branch+=' '; 
    			branch+='\'; cor2=(t->chi[1]->blank+t->blank)/2; 
    		}
            q.pop(); 
        } 
    } 
    void Doit(){ 
        root->hei=0; 
    	CalCor(root,0);
        // CalCor(root,0,l,oo,-1); 
        OutTree(root); 
        printf("
    //////////////////////////////////
    "); 
    } 
    inline AVLNode * CreatNode(AVLNode * &node,Int val,int cnt=1){  
        if(node!=NULL && node!=nil){ AVLNode *p=node; delete p; }  
        node=new AVLNode(); node->val=val; node->cnt=cnt;  
        node->pa=node->chi[0]=node->chi[1]=nil; node->bf=0;  
        return node;  
    }  
    inline void Connect(AVLNode *pa,AVLNode *node,int dir)  
        { pa->chi[dir]=node; node->pa=pa; }  
    AVLNode * Bound(AVLNode * node,Int val){  
        if(node==nil) return nil;  
        for(int dir;val!=node->val;node=node->chi[dir]){  
            dir=(val<node->val)?0:1;  
            if(node->chi[dir]==nil) return node;  
        }  
        return node;  
    }  
    AVLNode * Extrema(AVLNode * node,int dir){  
        while(node->chi[dir]!=nil) node=node->chi[dir];  
        return node;  
    }  
    AVLNode * Cessor(AVLNode * node,int dir){  
        if(node->chi[dir]!=nil) return Extrema(node->chi[dir],1-dir);  
        for(AVLNode * p=node->pa;p!=nil && p->chi[dir]==node;node=p,p=p->pa);  
        return node->pa;  
    }  
    void Rotate(AVLNode *node,int rodir){  
        Nil(); AVLNode *pivot=node->chi[1-rodir];  
        Connect(node,node->chi[1-rodir]->chi[rodir],1-rodir);  
        Connect(node->pa,pivot,(node->pa->chi[0]==node)?0:1);  
        Connect(pivot,node,rodir); Nil();  
    	if(root==node) root=pivot;  // !!!!!!
        node->bf+=(rodir)?2:-2; pivot->bf+=(rodir)?1:-1;  
        Doit(); 
    }  
        
    AVLNode * Search(AVLNode *root,Int val){  
        AVLNode *p=Bound(root,val);  
        if(p->val==val) return p; return nil;  
    }  
    void Balance(AVLNode * node,int dbf,int aimbf){  
        for((node->bf)+=dbf;aimbf!=abs(node->bf);(node->bf)+=dbf){  
    		dbf=(node->pa->chi[0]==node)?-1:1;
            if(abs(node->bf)==2){  
    			int dir=(node->bf<0)?0:1;  
    			if((node->bf)*(node->chi[dir]->bf)<0) Rotate(node->chi[dir],dir);  
    			Rotate(node,1-dir);
    			node->pa->bf-=dbf;  
    		}  
    		if((node=node->pa)==nil) { Nil(); return;}  
    	}  Nil();
    }  
    void Insert(AVLNode * &root,Int val){  
        if(root==nil){ root=CreatNode(root,val); return; }  
        Nil(); AVLNode *p=Bound(root,val);  
        if(p->val==val){ p->cnt++; return; }  
        int dir=(val<p->val)?0:1; AVLNode *node=nil;  
        CreatNode(node,val); Connect(p,node,dir);  
        Balance(p,(!dir)?-1:1,0);  
        Doit(); 
    }  
    bool Delete(AVLNode *root,Int val){  
        if(root==nil) return false;  
        Nil(); AVLNode *p=Search(root,val);  
        if(p==nil) return false;  
        if(p->cnt>1){ (p->cnt)--; return true; }  
        if(p->chi[0]!=nil || p->chi[1]!=nil){  
            AVLNode *suc=Cessor(p,1);  
            if(suc==nil) suc=Cessor(p,0);  
            p->val=suc->val; p=suc;  
        }  
        int dir=p->pa->chi[0]==p?0:1;  
        p->pa->chi[dir]=nil;  
        Balance(p->pa,(!dir)?1:-1,1); delete p;  
        Doit(); 
        return true;  
    }  
    void Traversal(AVLNode * root){  
        if(root->chi[0]!=nil) Traversal(root->chi[0]);  
        cout<<root->val;  
        printf(" %.4lf
    ",(double)root->cnt/(double)cnt*100.0); // double  
        if(root->chi[1]!=nil) Traversal(root->chi[1]);  
    }  
    int main(){  
    	freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout); 
        string s; 
        while (getline(cin,s)) // ## 
            if(s!="" && ++cnt) Insert(root,s); // ## 
        Traversal(root);  
        return 0;  
    } 
    

      

  • 相关阅读:
    Postman高级应用——流程控制、调试、公共函数、外部数据文件
    python模块之openpyxl
    appium实例1:启动淘宝app
    appium1.6在mac上环境搭建启动ios模拟器上Safari浏览器 转自:上海-悠悠
    appium 环境准备
    python_正则表达式
    接口测试指导方案 转:紫漪
    性能监控工具的配置及使用
    Python_斐波那契数列
    Js new一个函数和直接调用函数的区别
  • 原文地址:https://www.cnblogs.com/amyc/p/AVLNotes.html
Copyright © 2011-2022 走看看