Treap 是一棵树,主要用于排序,可以防止变态数据.普通的二叉搜索树,如果输入的数据基本有序,就会退化成O(n),使用二叉搜索树反而成了劣势。
Treap外加了一个随机变量,通过旋转使其保持堆的性质。
如题:HDU4585.题目大意:
少林寺来了许多和尚,和尚们要比武,根据上山的时间挑战山上已有的与他功力差不多的和尚,如果有两个和他功力差不多的,那他选择功力低于自己的.开始的时候山上只有主持,功力1000000000。然后,大师兄,二师兄们就要上山了。输出比赛记录。
#include <iostream>
#include <cstdio>
#include <ctime>
#include <cmath>
#include <queue>
#include <cstdlib>
#define INF 2000000000
using namespace std;
class Treap_Node
{
public:
Treap_Node *left, *right;
int value, fix, size, weight, num;
inline int lsize(){return left ? left->size : 0;}
inline int rsize(){return right ? right->size : 0;}
};
class Treap //Treap树
{
public:
Treap_Node *root;
Treap() : root(NULL) {srand(time(0));}
void ins(Treap_Node *&p, int value, int i);
void del(Treap_Node *&p, int value);
int find(Treap_Node *&p, int value);
void left_rotate(Treap_Node *&p);
void right_rotate(Treap_Node *&p);
};
void Treap::ins(Treap_Node *&p, int value, int i)
{
if (!p)
{
p = new Treap_Node;
p->value = value;
p->num = i;
p->fix = rand();
p->left = NULL;
p->right = NULL;
}
else if (value <= p->value)
{
Treap::ins(p->left, value, i);
if (p->left->fix < p->fix)
{
right_rotate(p);
}
}
else
{
Treap::ins(p->right, value, i);
if (p->right->fix < p->fix)
{
left_rotate(p);
}
}
}
void Treap::left_rotate(Treap_Node *&p)
{
Treap_Node *s = p->right;
p->right = s->left;
s->left = p;
p = s;
}
void Treap::right_rotate(Treap_Node *&p)
{
Treap_Node *s = p->left;
p->left = s->right;
s->right = p;
p = s;
}
int mi = INF, pos = 0;
int Treap::find(Treap_Node *&p, int value) //找一个功力与自己差不多的,多则取小
{
if (p)
{
if (p->value == value)
{
return p->num;
}
else if (value < p->value)
{
if (fabs(p->value - value) < mi)
{
mi = fabs(p->value - value);
pos = p->num;
}
else if (fabs(p->value - value) == mi)
{
if (p->value < value)
{
pos = p->num;
}
}
find(p->left, value);
}
else
{
if (fabs(p->value - value) < mi)
{
mi = fabs(p->value - value);
pos = p->num;
}
else if (fabs(p->value - value) == mi)
{
if (p->value < value)
{
pos = p->num;
}
}
find(p->right, value);
}
}
return pos;
}
void input()
{
int x, y, n;
while (scanf("%d", &n) && n)
{
Treap treap;
treap.ins(treap.root, 1000000000, 1);
for (int i = 1; i <= n; i++)
{
scanf("%d %d", &x, &y);
mi = INF;
pos = 0;
printf("%d %d\n", x, treap.find(treap.root, y));
treap.ins(treap.root, y, x);
}
}
}
int main()
{
input();
return 0;
}