您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: