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 ;}
阅读全文
0 0
- poj 2764 # splay tree
- Splay-tree poj 3580
- poj 3580 splay tree
- poj 2761 splay tree
- POJ 3580 SuperMemo (Splay tree)
- POJ 3580 SuperMemo (SPLAY TREE)
- 【splay tree】 POJ 3580 SuperMemo
- poj-3580 SuperMemo[splay tree]
- poj 3468 Splay Tree 区间操作
- poj 3468(线段树,splay tree)
- POJ 2828 Buy Tickets ( Splay tree && Segment tree )
- Splay Tree
- splay tree
- Splay Tree
- Splay Tree
- splay tree
- Splay tree
- splay tree
- 链表的使用
- 3d盒子代码
- jvm 年轻态
- 微信分享闪一下(闪退)总结
- Java程序设计基础-第三章
- poj 2764 # splay tree
- 每日AC-LeetCode-palindrome-partitioning-ii --动态规划
- 谷歌三大核心技术(一)Google File System中文版
- 1、SONIX单片机新建工程与烧录流程
- 时间管理——番茄工作法
- 2013.11.26
- 有趣的安全游戏--哈密顿行动(三)加密的文件
- K近邻算法
- dojo/aspect模块