luogu P3391 【模板】文艺平衡树(Splay) 非旋转treap

Code:

#include<bits/stdc++.h>
using namespace std;
void setIO(string s)
{
    string in=s+".in"; 
    string out=s+".out"; 
    freopen(in.c_str(),"r",stdin); 
    freopen(out.c_str(),"w",stdout);    
}
namespace fhqtreap
{
    #define maxn 300000
    #define lson ls[x]
    #define rson rs[x]
    int n,m,root;  
    int rev[maxn],val[maxn],key[maxn],rs[maxn],ls[maxn],siz[maxn]; 
    void pushup(int x)
    {
        siz[x]=siz[lson]+siz[rson]+1; 
    }
    void mark(int x)
    {
        if(!x)return; 
        swap(lson, rson), rev[x] ^= 1; 
    }
    void pushdown(int x)
    {
        if(!x || !rev[x]) return; 
        mark(lson), mark(rson), rev[x] = 0;    
    }
    void split(int x, int k, int &l, int &r)
    {
        if(x)
        {
            pushdown(x); 
            if(k<=siz[lson]) 
            {
                r = x; 
                split(lson, k, l, ls[r]); 
                pushup(r); 
            }
            else 
            {
                l = x; 
                split(rson, k - siz[lson] - 1, rs[l], r); 
                pushup(l); 
            }
        }
        else l = r = 0; 
    }
    int merge(int x,int y)
    {
        if(!x || !y) return x + y; 
        pushdown(x), pushdown(y); 
        if(key[x] < key[y])
        {
            ls[y] = merge(x, ls[y]); 
            pushup(y); 
            return y; 
        }
        else 
        {
            rs[x] = merge(rs[x], y); 
            pushup(x); 
            return x; 
        } 
    }
    void print(int x)
    {
        if(!x) return; 
        pushdown(x); 
        print(lson), printf("%d ",val[x]), print(rson); 
    } 
    int main()
    {
        scanf("%d%d",&n,&m); 
        for(int i=1;i<=n;++i)
        {
            key[i]=rand(), val[i]=i, siz[i]=1; 
            root=merge(root, i);  
        }
        for(int x,y,a=0,b=0,c=0,i=1;i<=m;++i)
        {
            scanf("%d%d",&x,&y);        // 反转 [x,y] 
            a = b = c = 0; 
            split(root, y, a, c);       // [1,y] -> a 
            split(a, x - 1, a, b);      // [1,x-1] -> a 
            mark(b); 
            root = merge(merge(a,b),c);      
        }
        print(root); 
        return 0; 
    }
}; 
int main()
{
    // setIO("input"); 
    fhqtreap :: main(); 
    return 0; 
}

  

转载于:https://www.cnblogs.com/guangheli/p/10685862.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值