splay 核心代码

Posted tztqwq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了splay 核心代码相关的知识,希望对你有一定的参考价值。

本文只提供splay最核心的代码, 不包括懒惰标记的下传等操作;


木得啥卵子用的基本框架

namespace splay
{
    
    const int MAXnodeSIZE = /*some number*/ ;
    
    int fa[MAXnodeSIZE], ls[MAXnodeSIZE], rs[MAXnodeSIZE]; // 分别表示 父节点, 左子节点, 右子节点
    int siz[MAXnodeSIZE]; // 表示以某节点为根的子树大小
    
    /* some fuctions */
    
}

十分强的基本操作

inline void upd(int q)
{
    /*maintain(维护) something, 比如siz*/
    // one simple example :
    //siz[q] = siz[ ls[q] ] + siz[ rs[q] ] + 1;
}

inline void ro( int q )
{
    int p = fa[q];
    
    if( ls[ fa[p] ] == p) ls[ fa[p] ] = q;
    else if( rs[ fa[p] ] == p) rs[ fa[p] ] = q;
    fa[q] = fa[p], fa[p] = q;
    // 1st change
    if(ls[p] == q)
    {
        ls[p] = rs[q], rs[q] = p;
        if( ls[p] ) fa[ ls[p] ] = p;
    }
    else
    {
        rs[p] = ls[q], ls[q] = p;
        if( rs[p] ) fa[ rs[p] ] = p;
    }
    // 2nd change
    upd(p); upd(q);
    // 3rd change
    // 由于树的形态改变, 某些与其相关的信息可能会发生改变
}

inline void splay(int q) {//将节点p旋转到根
    while( !is_root(q) )
    {
        int p = fa[q];
        if( !is_root(p) )//在有爷爷节点时试图双旋
        {
            if( (ls[ fa[p] ] == p) ^ (ls[p] == q) ) ro(q);
            else ro(p);
        }
        ro(q);
    }
    
}

以上是关于splay 核心代码的主要内容,如果未能解决你的问题,请参考以下文章

CSP核心代码片段记录

bzoj2733 永无乡 splay树的启发式合并

Java itext为pdf 文件添加水印核心功能代码片段

markdown [Apereo CAS 3.5 CORE] Apereo CAS 3.5 #CAS的核心代码片段

pbootcms对接微信扫码登录代码核心片段和步骤(前后端)

js代码片段