Splay操作序列
jys
posted @ Jul 17, 2013 07:36:54 PM
in 未分类
, 1066 阅读
终于写成了。
和普通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); }
建树的时候建成一棵平衡的比较好。