poj 2764 # splay tree

来源:互联网 发布:windows pe官方下载 编辑:程序博客网 时间:2024/06/06 18:29


呃 希望能用这个换一个好一点的splay板子

#include <cstdio>#include <cstring>#include <algorithm>using namespace std ;const int MAXN = 100005 ;const int MAXM = 50005 ;const int INF = 0x7FFFFFF ;class SplayTree{public :    SplayTree(){        nil = &_nil ;        _nil.value = 0 ;        _nil.size = 0 ;        _nil.parent = nil ;        _nil.child[LEFT] = nil ;        _nil.child[RIGHT] = nil ;    }    inline void clear(){        nodeNumber = 0 ;        root = nil ;        insert(-INF) ;        insert(INF) ;    }    inline void insert(const int value ){        if(root == nil){            root = newNode(nil , value) ;            return ;        }        Node * x = root ;        while(true ){            int dir = x->value < value ;            if( x->child[dir] == nil ){                x->child[dir] = newNode(x , value);                update(x) ;                splay(x->child[dir] , nil) ;                return ;            }else                x = x->child[dir] ;        }    }    inline void remove( const int value ){        int k = find(value ) ;        find(k - 1 , nil) ;        find(k + 1 , root) ;        root->child[RIGHT]->child[LEFT] = nil ;        update(root->child[RIGHT]) ;        update(root ) ;    }    inline int getKth(const int k ){        find ( k + 1 , nil ) ;        return root-> value ;    }    inline void print(){        printf("Splay tree : \n") ;        print(root) ;        printf("\n") ;    }private :    static const int LEFT = 0 ;    static const int RIGHT = 1 ;    struct Node {        int value , size ;        Node * parent , * child[2] ;    } _nil , node[MAXN] ;    int nodeNumber ;    Node *root , * nil ;    inline Node * newNode( Node * parent , const int value ){        node[nodeNumber].value = value ;        node[nodeNumber].size = 1 ;        node[nodeNumber].parent = parent ;        node[nodeNumber].child[LEFT] = nil ;        node[nodeNumber].child[RIGHT] = nil ;        return & node[nodeNumber ++ ] ;    }    inline void update( Node * x ){        if( x == nil ) return ;        x->size = x->child[LEFT]->size + x->child[RIGHT]->size + 1 ;    }    inline void rotate(Node * x , const int dir ){        Node * p = x->parent ;        p->child[!dir] = x->child[dir] ;        p->child[!dir]->parent = p ;        x->child[dir] = p ;        x->parent = p->parent ;        if(p->parent->child[LEFT] == p)            p->parent->child[LEFT] = x ;        else            p->parent->child[RIGHT] = x ;        p->parent = x ;        update(p) ;        update(x) ;        if( root == p ) root = x ;    }    inline void splay(Node * x , Node * y){        while(x->parent != y ){            if(x->parent->parent == y){                if(x->parent->child[LEFT] == x)                    rotate(x , RIGHT) ;                else                    rotate(x , LEFT) ;                }else if(x->parent->parent->child[LEFT] == x->parent){                    if(x->parent->child[LEFT] == x){                        rotate(x->parent , RIGHT) ;                        rotate(x , RIGHT) ;                    }else{                        rotate(x , LEFT) ;                        rotate(x , RIGHT) ;                    }                }else{                    if(x->parent->child[RIGHT] == x){                        rotate(x->parent , LEFT) ;                        rotate(x , LEFT) ;                    }else{                        rotate(x , RIGHT) ;                        rotate(x , LEFT) ;                    }                }                update(x) ;        }    }    inline void find (int k , Node * y ){        Node * x = root ;        while(k != x->child[LEFT]->size + 1 ){            if( k <= x->child[LEFT]->size)                x = x->child[LEFT] ;            else{                k -= x->child[LEFT]->size + 1 ;                x = x->child[RIGHT] ;            }        }        splay(x , y) ;    }    inline int find(const int value ){        Node * x = root ;        int count = 0 ;        while(true ){            if( x->value == value)                return count + x->size - x->child[RIGHT]->size ;            else if(x->value > value)                x = x->child[LEFT] ;            else{                count += x->size - x->child[RIGHT]->size ;                x = x->child[RIGHT] ;            }        }    }    inline void print(Node * x){        if( x == nil) return ;        printf("%d : %d %d %d\n" , x->value , x->child[LEFT]->value , x->child[RIGHT]->value , x->size) ;        print(x->child[LEFT]) ;        print(x->child[RIGHT]) ;    }}splay;struct Interval{    int a , b , k , index ;    bool operator < ( const Interval & kk ) const{        return b < kk.b ;    }} interval[MAXM] ;int pretty[MAXN] , ans[MAXM] ;int main(){    int n , m ;    while ( ~ scanf("%d %d" , &n , &m)){        for(int i = 1 ; i <= n ; i ++ ) scanf("%d" , &pretty[i]) ;        for(int i = 0 ; i < m ; i ++ ) {            scanf("%d %d %d" , &interval[i].a , &interval[i].b,&interval[i].k) ;            interval[i].index = i ;        }        sort(interval , interval + m ) ;        splay.clear() ;        int a = 1 , b = 0 ;        for( int i = 0 ; i < m ; i ++ ){            for( int j = a ; j < interval[i].a && j <= b ; j ++ ){                splay.remove(pretty[j]) ;            }            for(int j = max(interval[i].a , b+1) ; j <= interval[i].b ; j ++)                splay.insert(pretty[j]) ;            a = interval[i].a ;            b = interval[i].b ;            ans[interval[i].index] = splay.getKth((interval[i].k)) ;        }        for(int i = 0 ; i < m ; i ++ )            printf("%d\n" , ans[i]) ;    }    return 0 ;}

原创粉丝点击