Splay操作序列

jys posted @ Jul 17, 2013 07:36:54 PM in 未分类 , 1010 阅读

终于写成了。

和普通splay的不同主要在select这个函数还有在访问一个节点之后都要pushdown,修改/旋转后都要updata。

 

void select(int k,int aim)
{
	int o=root;pushdown(o);
	while(t[t[o].ch[0]].siz+1!=k)
	{
		if(t[t[o].ch[0]].siz+1>k)
			o=t[o].ch[0];
		else{k-=t[t[o].ch[0]].siz+1;o=t[o].ch[1];}
		pushdown(o);
	}
	if(aim!=root)
	{
		int tmp=root;
		root=aim;t[aim].f=-1;
		splay(o);
		root=tmp;setc(o,root,1);
	}
	else splay(o);
}

建树的时候建成一棵平衡的比较好。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter