「treap之 」 作用
1.插入数值x
2.删除数值x(如果有多个,只删除一个)
3.查询数值x的排名(如有多个相同的数,应输出最小的排名)
4.查询排名为x的数值
5. 求数值x的前驱(小于x最大的数)
6.求数值x的后继(大于x最小的数)
如何实现:
最基本操作」.set
山寨版set
#include<bits/stdc++.h>
using namespace std;
struct node{
node * son[2];
int r,v;//r : 优先级,v :键值
//比较键值的函数
int cmp(int x) const {if( x == v) return -1; return x < v ? 0 : 1;}
};
inline void rotate(node* &o,int d){node *k = o->ch[d^1];o->ch[d^a] = k->ch[d];k->ch[d] = o;o = k;}
void insert (node* &o, int x) {
if(o == NULL) { o = new node(); o->ch[0] = o->ch[1] = NULL; o->v = x; o->r = rand();}
//插到叶子 没有左右儿子 //随机优先级
else {
int d = o->cmp(x);
//d不会等于 -1吗????
insert(o->ch[d],x);if(o->ch[d]->r > o->r) rotate(o,d^1);
}
}
void remove (node* &o,int x){
int d = o->cmp(x);
//键值相等就比较优先级
//优先级是个堆,任意根节点大于子节点
if(d = -1){
//哪个儿子为空插哪个
if(o->ch[0] == NULL) o = o->ch[1];
else if(0->ch[1] == NULL)o = o->ch[0];
else {//不空就把大的儿子放到根
int d2 = (o->ch[0] -> r > o->ch[1] ->r ? 1 : 0);
retate(o,d2); remove (o->ch[d2],x);
}
}else remove(o->ch[d],x);
}
//判断插入或删除值是否存在。
int find (node* o,int x){
while(o != NULL) {
int d = o->cmp(x);
if(d == -1) return 1;
else o = o->ch[d];//一直往下找儿子。
}
return 0;
}
treap之」独特
rank tree
作用 ##:
- 找出第k小,
- x的排名