tkj
文章143
标签102
分类0
bzoj 3223: Tyvj 1729 文艺平衡树

bzoj 3223: Tyvj 1729 文艺平衡树

.

splay裸题
代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;
struct pnt
{
    int c,sz;
    bool rev;
    pnt *f,*s[2];
    pnt(int x,pnt *f):c(x),f(f),rev(0),sz(1)
    {
        s[0]=s[1]=0;
    }
}*root;
void pushdown(pnt *x)
{
    if(x->rev)
    {
        if(x->s[0])
        {
            x->s[0]->rev^=1;
            swap(x->s[0]->s[0],x->s[0]->s[1]);
        }
        if(x->s[1])
        {
            x->s[1]->rev^=1;
            swap(x->s[1]->s[0],x->s[1]->s[1]);
        }
        x->rev=0;
    }
}
void pushup(pnt *x)
{
    x->sz=1;
    if(x->s[0])
    x->sz+=x->s[0]->sz;
    if(x->s[1])
    x->sz+=x->s[1]->sz;
}
void rot(pnt *x)
{
    pnt *f=x->f,*ff=f->f,*R,*r;
    int w=x==f->s[0];
    R=f;r=x->s[w];
    R->s[1-w]=r;
    if(r)
    r->f=R;
    R=ff;r=x;
    if(R)
    R->s[f==ff->s[1]]=r;
    r->f=R;
    R=x;r=f;
    r->f=R;
    R->s[w]=r;
    pushup(f);
    pushup(x);
}
void splay(pnt *x,pnt *rt)
{
    pushdown(x);
    while(x->f!=rt)
    {
        pnt *f=x->f,*ff=f->f;
        if(ff==rt)
        rot(x);
        else if((f==ff->s[0])==(x==f->s[0]))
        {
            rot(f);
            rot(x);
        }
        else
        {
            rot(x);
            rot(x);
        }
    }
    if(rt==0)
    root=x;
}
pnt* add(int x,pnt *f)
{
    pnt *p=new pnt(x,f);
    if(f)
    {
        f->s[1]=p;
        pushup(f);
        splay(f,0);
    }
    else
    root=p;
    return p;
}
pnt* get(int pos)
{
    pnt *now=root;
    while(1)
    {
        pushdown(now);
        int szl=0;
        if(now->s[0])
        szl=now->s[0]->sz;
        if(szl>=pos)
        now=now->s[0];
        else if(pos>szl+1)
        {
            pos=pos-szl-1;
            now=now->s[1];
        }
        else
        return now;
    }
}
void rev(int l,int r)
{
    r+=2;
    pnt *ll=get(l),*rr=get(r);
    // printf("%d %d\n",ll->c,rr->c);
    splay(ll,0);
    splay(rr,ll);
    pnt *hh=rr->s[0];
    hh->rev^=1;
    swap(hh->s[0],hh->s[1]);
    splay(hh,0);
}
void out(pnt *x)
{
    if(!x)
    return;
    pushdown(x);
    out(x->s[0]);
    if(x->c>0&&x->c<=n)
    printf("%d ",x->c);
    out(x->s[1]);
}
int main()
{
    scanf("%d%d",&n,&m);
    pnt *last=0;
    for(int i=0;i<=n+1;i++)
    last=add(i,last);
    for(int i=0;i<m;i++)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        rev(l,r);
    }
    out(root);
}
本文作者:tkj
本文链接:https://tkj666.github.io/54/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可