您的位置:首页 > 理论基础 > 数据结构算法

Splay相关(摘自www.notonlysuccess.com)

2012-04-05 17:18 1386 查看
【splay入门】用其他平衡二叉树能解决:(理论复杂度没有sbt好,但我用splay却比写sbt还快=.=)
[HNOI2002]营业额统计
[NOI2004]郁闷的出纳员
[HNOI2004]宠物收养所

【splay热身】其他平衡二叉树不能解决,但是线段树和splay能解决(效率是线段树的1~5倍.)
I Hate It(更新节点,区间最值)
A Simple Problem with Integers(成段更新,区间求和)

Memory Control(较为复杂的区间操作)

更多热身题可以去这里

【splay进阶】其他平衡二叉树和线段树都无法解决:
Robotic Sort

比较有意思的题目,结点处没有任何权值,只要记录每个数字对应的结点位子,然后从小到打把相对应的位子旋转到根节点,输出i+左子树的个数,接着给左子树一个翻转的延迟标记,最后删除该节点.注意把结点旋到根部的时候要先从根部把延迟标记push_down下去.
Queue-jumpers

可以用各种数据结构解决的题,用splay的话和上题差不多,记录结点的位子..Top的操作有点麻烦,记得每次操作后都要把结点splay到根部,不然会超时=.=
Play with Chain

此题有splay的最独特的操作 区间旋转和切割
[AHOI2006]文本编辑器editor(较为简单的插入删除旋转,小数据版)
[AHOI2006]文本编辑器editor(较为简单的插入删除旋转,大数据版)

这题很恶心,最后一个是结束符号也会让你输出来,我纠结了很久很久
[NOI2005]维修数列(在插入删除基础上增加区间统计,较难)

区间统计如果做了上边三个热身题的话应该没问题了

旋转和区间统计的时候要特别注意,两者结合产生的trick留给大家自己去发现,这个trick整了我一个下午

50M的数据量,用静态的数组开不下,动态的太浪费时间,怎么办呢?自己手动压个内存池吧

总结.splay的区间操作看上去很复杂,其实就是函数多,略数一下有以下几个

void Rotate(int x,int f)

void Splay(int x,int goal)

void RotateTo(int k,int goal)

void NewNode(int &x,int c)

void push_down(int x)

void push_up(int x)

void makeTree(int &x,int l,int r,int f)

void init(int n)

这几个函数是必不可少的,并且还要再根据题目意思加一些函数

但是真正理解了之后会发现…写了最上边的三个函数后 其实剩下的就和线段树差不多,这样看来编程复杂度也不是很大,手抽筋一下花个5分钟敲下这几个函数也就OK了

所以splay的题完全可以套上线段树的马甲再加上线段树无法完成的操作变成更难的题目XD
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息