2437. Splay
题目链接
2437. Splay
给定一个长度为 的整数序列,初始时序列为 。
序列中的位置从左到右依次标号为 。
我们用 来表示从位置 到位置 之间(包括两端点)的所有数字构成的子序列。
现在要对该序列进行 次操作,每次操作选定一个子序列 ,并将该子序列中的所有数字进行翻转。
例如,对于现有序列 1 3 2 4 6 5 7
,如果某次操作选定翻转子序列为 ,那么经过这次操作后序列变为 1 3 5 6 4 2 7
。
请你求出经过 次操作后的序列。
输入格式
第一行包含两个整数 。
接下来 行,每行包含两个整数 ,用来描述一次操作。
输出格式
共一行,输出经过 次操作后的序列。
数据范围
,
输入样例:
输出样例:
解题思路
splay
的关键在于 ,表示将节点 放在节点 的下面,并且复杂度是 级别的,但要求按固定方式旋转,即在要将 左/右旋而上的情况下,如果 呈链状,则旋转两次 ,否则先旋转 ,再旋转 。其次每次插入一个数后要求该数表示的节点 需为根节点,即执行 操作。这两种操作保证 能够维持中序遍历。一般常见的有两种操作:插入和删除。例如删除区间 ,则可以找到 表示的节点 , 表示的节点 ,将 放在根节点上,即执行 操作,然后将 放在 下,即执行 操作,此时由于中序遍历, 此时作为 的右子树,而 表示的一些节点正好是 的左子树,删除左子树即删除区间 ,插入区间操作同理。
本题要求翻转 次选择的区间,可像线段树一样打懒标记,假设翻转 的区间,即要求找到其表示的子树,则可以先找到 和 表示的节点,但由于范围可能会越界,所以提前应该加上两个哨兵 ,故此时应该找区间 第 和 个数表示的节点 和 ,注意,这里表示的区间编号和节点编号是不同的,区间编号 对应该数在 中序遍历下的 第 个数,即按中序遍历下的第 大的节点。找到后,将 置于根节点 ,将 置于 下即其右子树 , 的左子树其所求区间表示的节点,将其打上懒标记即可
- 时间复杂度:
代码
__EOF__

本文链接:https://www.cnblogs.com/zyyun/p/16459949.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!