struct Node {
Node *ch[2];
int Rank;
int val, sz;
int cmp(int x) const {
if(x == val) return -1;
return x < val ? 0 : 1;
}
void maintain() {
if(ch[0]) sz = ch[0]->sz + 1;
if(ch[1]) sz = ch[1]->sz + 1;
}
};
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)
{
if(!o) {
o = new Node();
o->ch[0] = o->ch[1] = NULL;
o->val = x;
o->Rank = rand();
}
else {
int d = o->cmp(x);
if(d == -1) exit(-1);//不允许插入相同值
insert(o->ch[d], x);
if(o->ch[d]->Rank > o->Rank) {
rotate(o, d^1);
}
}
}
void remove(Node *&o, int x)
{
int d = o->cmp(x);
if(d == -1) {
if(!o->ch[0]) o = o->ch[1];
else if(!o->ch[1]) o = o->ch[0];
else {
int d2;
d2 = o->ch[0]->Rank > o->ch[1]->Rank ? 1 : 0;
rotate(o, d2);
remove(o->ch[d2], x);
}
}
else remove(o->ch[d], x);
}
bool find(Node *o, int x)
{
while(o) {
int d = o->cmp(x);
if(d == -1) return true;
else o = o->ch[d];
}
return false;
}
int kth(Node *o, int k)
{
if(!o || k <= 0 || k > o->sz) return 0;
int sz = (o->ch[1] ? o->ch[1]->sz : 0);
if(k == sz + 1) return o->val;//是o点
else if(k <= sz) return kth(o->ch[1], k);
else return kth(o->ch[0], k-sz-1);
}
【Treap】Treap模板
最新推荐文章于 2021-03-02 22:40:53 发布