views
Word count: 1.3k
(~5 mins to read)
Last updated:
原题地址:https://www.luogu.org/problemnew/show/P3391
题目简述
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:
翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1
思路
Splay是一种二叉搜索树。如果不知道的话……
百度百科对BST的介绍:
1 | 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 |
首先明白Splay比起线段树能多干什么:
- 可以在一个有序序列中任意数后面动态插入一串数(不能比a后面一个数还大)
- 可以删除一段区间
可能描述不是很清楚,具体看这里面给的论文链接:信息学竞赛相关优秀文章合集
或者直接看这里:运用伸展树解决数列维护问题.pdf
如果搞不懂左旋右旋是什么,可以先看信息学竞赛相关优秀文章合集里的AVL树介绍。
对于AVL树是一种为了防止树结构不够优导致深度过深时间复杂度退化,在保持二叉搜索树性质不变的前提下进行的一种变换。简单说就是把往一边沉的树弄的两边平衡些。
而在Splay中,将特定点旋转到一定位置可以进行提取区间等操作,同时各种旋转间接的使树**基本平衡(是的,可以构造数据卡掉。Treap树对此表示同情)**。
左旋(下面代码里的表达:把S往上转一次)→
右旋(下面代码里的表达:把E往上转一次)→
图片来源:http://blog.csdn.net/sun_tttt/article/details/65445754
(文章是介绍红黑树的但是这个左旋右旋操作二叉搜索树通用)
论文里讲的很详细~
具体到这道题,引用一下zcysky在题解里给出的解释:
1 | Splay可以用来维护序列。这样的话是把Splay当作一棵区间树。 |
作为模板题没什么好说的。这边文章主要记录板子用。感谢zcysky的板子。
代码
1 |
|