splay求助

P3391 【模板】文艺平衡树

EZIOPQR @ 2019-04-04 21:56:31

样例能过,提交0分

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
struct node{
    int num,cnt,size,fa,child[2];
}p[1000099];
int n,m;
int rev[1000099];
int cnt;
int root;
void pushup(int x){
    p[x].size=p[x].cnt+p[p[x].child[0]].size+p[p[x].child[1]].size;
}
void pushdown(int x){
    if(rev[x]){
        swap(p[x].child[0],p[x].child[1]);
        rev[p[x].child[0]]^=1;
        rev[p[x].child[1]]^=1;
        rev[x]=0;
    }
}
bool getSon(int x){
    return p[p[x].fa].child[1]==x;
}
void rotate(int x){
    /*
    int y=p[x].fa;
    int z=p[y].fa;
    int k=getSon(x);
    if(getSon(y)){
        p[z].child[1]=x;
    }else{
        p[z].child[0]=x;
    }
    if(getSon(x)){
        p[y].child[1]=p[x].child[0];
        p[x].child[0]=y;
        p[y].fa=x;
        p[x].fa=z;
        p[p[y].child[1]].fa=y;
    }else{
        p[y].child[0]=p[x].child[1];
        p[x].child[1]=y;
        p[y].fa=x;
        p[x].fa=z;
        p[p[y].child[0]].fa=y;
    }*/
    int y=p[x].fa;
    int z=p[y].fa;
    int k=getSon(x);
    int w=p[x].child[k^1];
    p[y].child[k]=w;
    p[w].fa=y;
    p[z].child[getSon(y)]=x;
    p[x].fa=z;
    p[x].child[k^1]=y;
    p[y].fa=x;
    pushup(y);
    pushup(x);
}
void splay(int x,int goal){
    while(p[x].fa!=goal){
        int y=p[x].fa;
        int z=p[y].fa;
        //cout<<"ok"<<y<<endl;
        if(z!=goal){
            if(getSon(x)==getSon(y)) rotate(y);
            else rotate(x);
        }
        rotate(x);
    }
    if(!goal) root=x;
}
void insert(int x){
    int cur=root,par=0;
    while(cur&&p[cur].num!=x){
        par=cur;
        cur=p[cur].child[x>p[cur].num];
    }
    if(cur) p[cur].cnt++;
    else{
        cur=++cnt;
        if(par){
            p[par].child[x>p[par].num]=cur;
        }
        p[cur].child[0]=p[cur].child[1]=0;
        p[cur].fa=par;
        p[cur].num=x;
        p[cur].size=p[cur].cnt=1;
        //pushup(par);
    }
    splay(cur,0);
}
int kth(int k){
    int cur=root;
    while(1){
        if(p[cur].child[0]&&k<=p[p[cur].child[0]].size){
            cur=p[cur].child[0];
        }else if(p[p[cur].child[0]].size+p[cur].cnt<k){
            k-=p[p[cur].child[0]].size+p[cur].cnt;
            cur=p[cur].child[1];
        }else{
            return cur;
        }   
    }
}
void reverse(int l,int r){
    int x=kth(l),y=kth(r+2);
    splay(x,0);
    splay(y,x);
    rev[p[y].child[0]]^=1;
}
void dfs(int x){
    pushdown(x);
    if(p[x].child[0]) dfs(p[x].child[0]);
    if(p[x].num&&p[x].num<=n) printf("%d ", p[x].num);
    if(p[x].child[1]) dfs(p[x].child[1]);
}
int main(){
    scanf("%d%d", &n, &m);
    for(int i=0;i<=n+1;i++) insert(i);
    //dfs(root);
    while(m--){
        int x,y;
        scanf("%d%d", &x, &y);
        reverse(x,y);
    }
    dfs(root);
    return 0;
}

|