poj 3481 Treap

又一道数据结构的题目,用Treap可以轻松解决。

  1 #include <iostream>
  2 #include <cstring>
  3 #include <cstdlib>
  4 #include <cstdio>
  5 #include <ctime>
  6 using namespace std;
  7 
  8 struct Node 
  9 {
 10     Node * ch[2];
 11     int v, r, size, info;
 12     int cmp( int x )
 13     {
 14         if ( x == v ) return -1;
 15         return x < v ? 0 : 1;
 16     }    
 17     void maintain()
 18     {
 19         size = 1;
 20         if ( ch[0] != NULL ) size += ch[0]->size;
 21         if ( ch[1] != NULL ) size += ch[1]->size;
 22     }
 23 };
 24 
 25 void rotate( Node * & o, int d )
 26 {
 27     Node * k = o->ch[d ^ 1];
 28     o->ch[d ^ 1] = k->ch[d];
 29     k->ch[d] = o;
 30     o->maintain();
 31     k->maintain();
 32     o = k;
 33 }
 34 
 35 void insert( Node * & o, int x, int info )
 36 {
 37     if ( o == NULL )
 38     {
 39         o = new Node();
 40         o->ch[0] = o->ch[1] = NULL;
 41         o->v = x;
 42         o->r = rand();
 43         o->info = info;
 44         o->size = 1;
 45     }
 46     else
 47     {
 48         int d = o->cmp(x);
 49         insert( o->ch[d], x, info );
 50         if ( o->ch[d]->r > o->r )
 51         {
 52             rotate( o, d ^ 1 );
 53         }
 54         else
 55         {
 56             o->maintain();
 57         }
 58     }
 59 }
 60 
 61 void remove( Node * & o, int x )
 62 {
 63     int d = o->cmp(x);
 64     if ( d == -1 )
 65     {
 66         if ( o->ch[0] != NULL && o->ch[1] != NULL )
 67         {
 68             int dd = ( o->ch[0]->r > o->ch[1]->r ? 1 : 0 );
 69             rotate( o, dd );
 70             remove( o->ch[dd], x );
 71         }
 72         else
 73         {
 74             Node * u = o;
 75             if ( o->ch[0] == NULL ) o = o->ch[1];
 76             else o = o->ch[0];
 77             delete u;
 78         }
 79     }
 80     else
 81     {
 82         remove( o->ch[d], x );
 83     }
 84     if ( o != NULL ) o->maintain();
 85 }
 86 
 87 int ans_info, ans_v;
 88 
 89 void findmin( Node * o )
 90 {
 91     while ( o->ch[0] != NULL )
 92     {
 93         o = o->ch[0];
 94     }
 95     ans_v = o->v;
 96     ans_info = o->info;
 97 }
 98 
 99 void findmax( Node * o )
100 {
101     while ( o->ch[1] != NULL )
102     {
103         o = o->ch[1];
104     }
105     ans_v = o->v;
106     ans_info = o->info;
107 }
108 
109 int main ()
110 {
111     int op;
112     Node * root = NULL;
113     while ( scanf("%d", &op), op )
114     {
115         if ( op == 1 )
116         {
117             int info, x;
118             scanf("%d%d", &info, &x);
119             insert( root, x, info );
120         }
121         else if ( op == 2 )
122         {
123             if ( root == NULL )
124             {
125                 printf("0\n");
126             }
127             else
128             {
129                 findmax(root);
130                 printf("%d\n", ans_info);
131                 remove( root, ans_v );
132             }
133         }
134         else
135         {
136             if ( root == NULL )
137             {
138                 printf("0\n");
139             }
140             else
141             {
142                 findmin(root);
143                 printf("%d\n", ans_info);
144                 remove( root, ans_v );
145             }
146         }
147     }
148     return 0;
149 }

 

转载于:https://www.cnblogs.com/huoxiayu/p/4695870.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值