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

文艺平衡树

时间:2018-01-24 10:52:53      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:div   set   struct   getch   date   main   i++   ret   get   

原题链接:https://www.luogu.org/problemnew/show/P3391

splay处理区间问题板子,备用。

等待补充详细解释中。

#include<cstdio>
void read(int &y)
{
    y=0;char x=getchar();
    while(x<0||x>9) x=getchar();
    while(x>=0&&x<=9)
    {
        y=y*10+x-0;
        x=getchar();
    }
}
struct tree
{
    int ch[2],s,v,f,w;
}tr[100005];
int n,m,rot,tot;
void set(int k,int x,int z)
{
    tr[k].ch[0]=tr[k].ch[1]=0;
    tr[k].s=0;tr[k].v=x;
    tr[k].w=z;
}
void update(int k)
{
    tr[k].s=tr[tr[k].ch[0]].s+tr[tr[k].ch[1]].s+1;
}
void pushdown(int k)
{
    if(tr[k].f)
    {
        tr[tr[k].ch[0]].f^=1;
        tr[tr[k].ch[1]].f^=1;
        tr[k].f=0;
        int t=tr[k].ch[0];
        tr[k].ch[0]=tr[k].ch[1];
        tr[k].ch[1]=t;
    }
}
void rotate(int x)
{
    int y=tr[x].w;
    int z=tr[y].w;
    int k=(tr[y].ch[1]==x);
    if(tr[z].ch[1]==y) tr[z].ch[1]=x;
    else tr[z].ch[0]=x; 
    tr[x].w=z;
    tr[y].ch[k]=tr[x].ch[k^1];
    tr[tr[x].ch[k^1]].w=y;
    tr[x].ch[k^1]=y;
    tr[y].w=x;
    update(y);update(x);
}
void splay(int x,int a)
{
    while(tr[x].w!=a)
    {
        int y=tr[x].w;
        int z=tr[y].w;
        if(z!=a)
        {
            int p1=(tr[z].ch[1]==y);
            int p2=(tr[y].ch[1]==x);
            if(p1^p2) rotate(x);
            else rotate(y);
        }
        rotate(x);
    }
    if(a==0) rot=x;
    
}
void insert(int x)
{
    int t=rot,nxt=0;
    while(t)
    {
        nxt=t;
        if(x>tr[t].v) t=tr[t].ch[1];
        else t=tr[t].ch[0];
    }
    t=++tot;
    if(nxt)
    {
        if(x>tr[nxt].v) tr[nxt].ch[1]=t;
        else tr[nxt].ch[0]=t;
    }
    set(t,x,nxt);
    splay(t,0);
}
int kth(int k)
{
    int t=rot;
    while(1)
    {
        pushdown(t);
        if(tr[tr[t].ch[0]].s>=k) t=tr[t].ch[0];
        else if(tr[tr[t].ch[0]].s+1==k) return t;
        else
        {
            k-=tr[tr[t].ch[0]].s+1;
            t=tr[t].ch[1];
        }
    }
}
void print(int t)
{
    pushdown(t);
    if(tr[t].ch[0]) print(tr[t].ch[0]);
    if(tr[t].v>1&&tr[t].v<n+2) printf("%d ",tr[t].v-1);
    if(tr[t].ch[1]) print(tr[t].ch[1]);
}
void solve(int l,int r)
{
    l=kth(l);
    r=kth(r+2);
    splay(l,0);splay(r,l);
    tr[tr[tr[rot].ch[1]].ch[0]].f^=1;
}
int main()
{
    read(n);read(m);
    int l,r;
    for(int i=1;i<=n+2;i++) insert(i);
    while(m--)
    {
        read(l);read(r);
        solve(l,r);
    }
    print(rot);
    return 0;
}

 

文艺平衡树

标签:div   set   struct   getch   date   main   i++   ret   get   

原文地址:https://www.cnblogs.com/zeroform/p/8340122.html

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