poj 3481 Treap
2015-08-02 15:43
190 查看
又一道数据结构的题目,用Treap可以轻松解决。
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <ctime> using namespace std; struct Node { Node * ch[2]; int v, r, size, info; int cmp( int x ) { if ( x == v ) return -1; return x < v ? 0 : 1; } void maintain() { size = 1; if ( ch[0] != NULL ) size += ch[0]->size; if ( ch[1] != NULL ) size += ch[1]->size; } }; void rotate( Node * & o, int d ) { Node * k = o->ch[d ^ 1]; o->ch[d ^ 1] = k->ch[d]; k->ch[d] = o; o->maintain(); k->maintain(); o = k; } void insert( Node * & o, int x, int info ) { if ( o == NULL ) { o = new Node(); o->ch[0] = o->ch[1] = NULL; o->v = x; o->r = rand(); o->info = info; o->size = 1; } else { int d = o->cmp(x); insert( o->ch[d], x, info ); if ( o->ch[d]->r > o->r ) { rotate( o, d ^ 1 ); } else { o->maintain(); } } } void remove( Node * & o, int x ) { int d = o->cmp(x); if ( d == -1 ) { if ( o->ch[0] != NULL && o->ch[1] != NULL ) { int dd = ( o->ch[0]->r > o->ch[1]->r ? 1 : 0 ); rotate( o, dd ); remove( o->ch[dd], x ); } else { Node * u = o; if ( o->ch[0] == NULL ) o = o->ch[1]; else o = o->ch[0]; delete u; } } else { remove( o->ch[d], x ); } if ( o != NULL ) o->maintain(); } int ans_info, ans_v; void findmin( Node * o ) { while ( o->ch[0] != NULL ) { o = o->ch[0]; } ans_v = o->v; ans_info = o->info; } void findmax( Node * o ) { while ( o->ch[1] != NULL ) { o = o->ch[1]; } ans_v = o->v; ans_info = o->info; } int main () { int op; Node * root = NULL; while ( scanf("%d", &op), op ) { if ( op == 1 ) { int info, x; scanf("%d%d", &info, &x); insert( root, x, info ); } else if ( op == 2 ) { if ( root == NULL ) { printf("0\n"); } else { findmax(root); printf("%d\n", ans_info); remove( root, ans_v ); } } else { if ( root == NULL ) { printf("0\n"); } else { findmin(root); printf("%d\n", ans_info); remove( root, ans_v ); } } } return 0; }
相关文章推荐
- 跨域问题
- RSA算法原理(一)
- java单例模式
- 转载:解题笔记
- php中的$_SERVER从哪来
- leetcode 61: Rotate List
- NSString基本用法
- [poj 2960]S-Nim
- Font: a C++ class
- 用栈实现队列-用队列实现栈
- android record
- 小贝_redis list类型学习
- 编写struts.xml时的提示问题
- TI FAE 中文论坛
- DesignPattern之Mediator
- 感受异或的神奇
- 通过 VMware 安装 Mac OS X 10.10 Yosemite 8
- [深入理解Android卷一全文-第四章]深入理解zygote
- Lining Up Rabbit hunt poj 1118 poj 2606 点共线问题。
- php中如何防止CSRF攻击