zoukankan      html  css  js  c++  java
  • P3391 【模板】文艺平衡树

    题目链接:

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define re register
    const int N=1e6+10;
    void read(int &a)
    {
        a=0;int d=1;char ch;
        while(ch=getchar(),ch>'9'||ch<'0')
            if(ch=='-')
                d=-1;
        a=ch^48;
        while(ch=getchar(),ch>='0'&&ch<='9')
            a=(a<<3)+(a<<1)+(ch^48);
        a*=d;
    }
    struct note{int ch[2],siz,tag,cnt,val,fa;}spl[N];
    int rt,cnt,n,m;
    void newnode(int &now,int fa,int val)
    {
        spl[now=++cnt].val=val;
        spl[now].siz=spl[now].cnt=1;
        spl[now].fa=fa;
        spl[now].tag=0;
    }
    int ident(int x,int f){return spl[f].ch[1]==x;}///判断是否为右儿子
    void connect(int x,int f,int s)
    {
        spl[f].ch[s]=x;
        spl[x].fa=f;
    }
    void update(int now){spl[now].siz=spl[spl[now].ch[0]].siz+spl[spl[now].ch[1]].siz+1;}
    void rotat(int x)
    {
        int f=spl[x].fa,ff=spl[f].fa,k=ident(x,f);
        connect(spl[x].ch[k^1],f,k);
        connect(x,ff,ident(f,ff));
        connect(f,x,k^1);
        update(f),update(x);
    }
    void splaying(int x,int top)///把x转到top的儿子
    {
        if(!top) rt=x;
        while(spl[x].fa!=top)
        {
            int f=spl[x].fa,ff=spl[f].fa;
            if(ff!=top) ident(f,ff)^ident(x,f)?rotat(x):rotat(f);
            rotat(x);
        }
    }
    void ins(int val,int &now=rt,int fa=0)
    {
        if(!now) newnode(now,fa,val),splaying(now,0);
        else if(spl[now].val>val) ins(val,spl[now].ch[0],now);
        else if(spl[now].val<val) ins(val,spl[now].ch[1],now);
        else spl[now].siz++,splaying(now,0);
    }
    inline void pushdown(int x)
    {
        if(spl[x].tag)
        {
            spl[spl[x].ch[0]].tag^=1;
            spl[spl[x].ch[1]].tag^=1;
            spl[x].tag=0;
            swap(spl[x].ch[0],spl[x].ch[1]);
        }
    }
    int getv(int k)
    {
        int v=rt;
        while(1)
        {
            pushdown(v);
            if(spl[spl[v].ch[0]].siz>=k)v=spl[v].ch[0];
            else if(spl[spl[v].ch[0]].siz+1==k) return v;
            else k-=spl[spl[v].ch[0]].siz+1,v=spl[v].ch[1];
        }
    }
    void rever(int l,int r)
    {
        l=getv(l);r=getv(r+2);
        splaying(l,0),splaying(r,l);
        spl[spl[spl[rt].ch[1]].ch[0]].tag^=1;
    }
    void ldr(int now)
    {
        pushdown(now);
        if(!now) return;
        ldr(spl[now].ch[0]);
        if(spl[now].val>1&&spl[now].val<n+2) printf("%d ",spl[now].val-1);
        ldr(spl[now].ch[1]);
    }
    int main()
    {
        read(n),read(m);
        for(re int i=1;i<=n+2;i++) ins(i,rt);
        for(re int i=1,x,y;i<=m;i++) read(x),read(y),rever(x,y);
        ldr(rt);
        return 0;
    }
  • 相关阅读:
    Linux下sed,awk,grep,cut,find学习笔记
    Python文件处理(1)
    KMP详解
    Java引用详解
    解决安卓中页脚被输入法顶起的问题
    解决swfupload上传控件文件名中文乱码问题 三种方法 flash及最新版本11.8.800.168
    null id in entry (don't flush the Session after an exception occurs)
    HQL中的Like查询需要注意的地方
    spring mvc controller间跳转 重定向 传参
    node to traverse cannot be null!
  • 原文地址:https://www.cnblogs.com/acm1ruoji/p/11943620.html
Copyright © 2011-2022 走看看