码迷,mamicode.com
首页 > 其他好文 > 详细

splay

时间:2017-12-07 17:24:02      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:split   swap   space   def   build   sync   with   print   node   

#include <bits/stdc++.h>
#define rev(o) (o)=!(o)
using namespace std;
struct Node{
    int s,k;
    bool f;
    Node *son[2];
    Node(int m=0){
        s=0;
        k=m;
        f=false;
        son[1]=son[0]=NULL;
    }
    void maintain(){
        s=1;
        if(son[0])
            s+=son[0]->s;
        if(son[1])
            s+=son[1]->s;
    }
    void down(){
        swap(son[1],son[0]);
        if(son[0])
            rev(son[0]->f);
        if(son[1])
            rev(son[1]->f);
        f=false;
    }
    int cmp(int m){
        int d=0;
        if(son[0])
            d=son[0]->s;
        if(m<=d)
            return 0;
        if(m==d+1)
            return -1;
        return 1;
    }
};
void rotate(Node *&o,int d){
    Node *t;
    if(o->f)
        o->down();
    t=o->son[d^1];
    if(t->f)
        t->down();
    o->son[d^1]=t->son[d];
    t->son[d]=o;
    o->maintain();
    t->maintain();
    o=t;
}
void splay(Node *&o,int k){
    int d1,d2,k2=k,k3;
    if(o->f)
        o->down();
    d1=o->cmp(k);
    if(!~d1||!o->son[d1])
        return;
    if(o->son[d1]->f)
        o->son[d1]->down();
    if(d1){
        k2--;
        if(o->son[0])
            k2-=o->son[0]->s;
    }
    d2=o->son[d1]->cmp(k2);
    if(!~d2||!o->son[d1]->son[d2]){
        rotate(o,d1^1);
        return;
    }
    k3=k2;
    if(d2){
        k3--;
        if(o->son[d1]->son[0])
            k3-=o->son[d1]->son[0]->s;
    }
    splay(o->son[d1]->son[d2],k3);
    if(d1==d2){
        rotate(o,d1^1);
        rotate(o,d2^1);
    }
    else {
        rotate(o->son[d1],d1);
        rotate(o,d2);
    }
}
Node* merge(Node *l,Node *r){
    splay(l,l->s);
    l->son[1]=r;
    l->maintain();
    return l;
}
void split(Node *o,Node *&l,Node *&r,int k){
    splay(o,k);
    l=o;
    r=o->son[1];
    l->son[1]=NULL;
    l->maintain();
}
void reverse(Node *&o,int l,int r){
    splay(o,r+2);
    splay(o->son[0],l);
    rev(o->son[0]->son[1]->f);
}
void print(Node *o){
    if(!o)
        return;
    if(o->f)
        o->down();
    print(o->son[0]);
    if(o->k)
        cout<<o->k<<‘ ‘;
    print(o->son[1]);
}
void build(Node *&o,int n){
    for(;n;n--)
        o=merge(new Node(n),o);
    o=merge(o,new Node());
    o=merge(new Node(),o);
}
int main(){
int n,m;
Node *root=NULL;
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    build(root,n);
    while(m--){
        int l,r;
        cin>>l>>r;
        reverse(root,l,r);
    }
    print(root);
    return 0;
}

 

splay

标签:split   swap   space   def   build   sync   with   print   node   

原文地址:http://www.cnblogs.com/HC-LittleJian/p/7999489.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!