模板_Splay Tree

来源:互联网 发布:c语言题库及详解答案 编辑:程序博客网 时间:2024/06/05 20:15
#include<cstdio>#include<cstdlib>#include<iostream>using namespace std;struct Node{    Node* ch[2];    int r,v,s;    Node(int v):v(v){ch[0]=ch[1]=NULL;r=rand();s=1;}    bool operator < (const Node &a)const {return r<a.r;}    int comp(int x){if(x==v) return -1;return x<v?0:1;}    void maintain(){s=1;if(ch[0]!=NULL) s+=ch[0]->s;if(ch[1]!=NULL) s+=ch[1]->s;}};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==NULL) o=new Node(x);    else{        int d=(x<o->v?0:1);insert(o->ch[d],x);        if(o->ch[d]->r > o->r) rotate(o,d^1);    }    o->maintain();}void remove(Node* &o,int x){    int d=o->comp(x);    if(d==-1){        Node *u=o;        if(o->ch[0]!=NULL&&o->ch[1]!=NULL){            int d2=(o->ch[0]->r > o->ch[1]->r?1:0);            rotate(o,d2);remove(o->ch[d2],x);        }else{            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();}void splay(Node* &o,int k){//伸展     int d=o->comp(k);    if(d==1) k-=o->ch[0]->s+1;    if(d!=-1){        Node *p=o->ch[d];        int d2=p->comp(k);        int k2=(d2==0?k:k-p->ch[0]->s-1);        if(d2!=-1){            splay(p->ch[d2],k2);            if(d==d2) rotate(o,d^1);else rotate(o->ch[d],d);        }        rotate(o,d^1);    }}Node *merge(Node *left,Node *right){//合并      splay(left,left->s);left->ch[1]=right;    left->maintain();return left;}void split(Node *o,int k,Node* &left,Node* &right){//分裂 前K小在left中其余在right中     splay(o,k);left=o;right=o->ch[1];    o->ch[1]=NULL;left->maintain(); }int main(){    return 0;}
1 0
原创粉丝点击