zoukankan      html  css  js  c++  java
  • 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);
    	}
    	
    }
    
  • 相关阅读:
    lodash kebabCase
    lodash escapeRegExp 转义正则特殊字符
    lodash capitalize 首字母大写
    lodash camelCase 驼峰写法
    lodash pick
    lodash random
    lodash round
    Linux 目录结构
    每天一个linux命令(6/18):lsof命令
    Linux 内核编译步骤及配置详解
  • 原文地址:https://www.cnblogs.com/tztqwq/p/12219231.html
Copyright © 2011-2022 走看看