改良
#include <iostream> #include <ctime> #include <cstdlib> #define MAX 100 using namespace std; const int MAX_NODE=100; struct Node{ Node* ch[2];//左右子树 int fix;//优先级。数值越大,优先级越高 int key; int size;//以它为根的子树的总结点数 bool operator<(const Node& rhs) const { return key<rhs.key; } int cmp(int x) const{ if (x==key) return -1; return x<key?0:1; } //名次树 void maintain(){ size=1; if (ch[0]!=NULL) size+=ch[0]->size; if (ch[1]!=NULL) size+=ch[1]->size; } }; struct Treap{ Node nodePool[MAX_NODE],*cur; Node* root; Treap(){ srand(time(0)); cur=nodePool; root=NULL; } void clear(){ srand(time(0)); cur=nodePool; root=NULL; } Node* newNode(){ Node* t=cur++; return t; } //d=0代表左旋,d=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; } //在以o为根的子树中插入键值x,修改o void insert(Node* &o,int x){ if (o==NULL){ o=newNode(); o->ch[0]=o->ch[1]=NULL; o->key=x; o->fix=rand(); } else { int d=o->cmp(x); if (d!=-1){ insert(o->ch[d],x); if (o->ch[d]>o) 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 (o->ch[1]==NULL) o=o->ch[0]; else{ int d2=(o->ch[0]>o->ch[1]?1:0); rotate(o,d2); remove(o->ch[d2],x); } } else remove(o->ch[d],x); } bool 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; } };