CODEVS-3303-翻转区间
来源:互联网 发布:淘宝没有人工客服了吗 编辑:程序博客网 时间:2024/06/08 03:09
描述
http://codevs.cn/problem/3303/
分析
本题就是一个普通的通过打标记实现区间翻转的
splay
题目. 之前发过翻转卡片和这个题很像. 这里主要是想仔细分析一下标记的实现以及一些问题. 为后面的维护数列做一些准备工作.
- 首先明确, 为什么可以通过标记的方式记录翻转信息.
splay 的一棵子树代表的就是一个连续的区间, 因为splay是BST, 满足结点o的左儿子(lc) <= 根节点(o) <= 右儿子(rc). 并且如果o是其父结点的左儿子, rc一定比o的父节点要小; 如果o是其父结点的右儿子, lc一定又比o的父节点要大. 这样就保证了区间是连续的, 而且这个区间的序列就是这棵子树的先序遍历的结果.
- 既然子树是一个封闭的区间了, 对其打上翻转标记后就可以表示区间已经被翻转了. 那么如何标记下传呢? 首先根结点的左右子树应该交换一下, 也就是以根结点o为分界点, 比o小的lc交换到比o大的rc上, 比o大的rc交换到比o小的lc上. 接着以左右子结点为根节点分别将标记下传到左右两棵子树上… 层层下传, 最终实现整个区间的翻转. 这就是分治的思想. 当然实现中需要时才将标记下传一步.
- 最后一个问题, 何时进行标记下传? 标记下传后如何维护其父结点以及祖先的值?
这里还要分两种情况, 第一种是自底向上的splay, 这种需要在find()
时把遇到的所有结点进行标记下传,find()
会经过到达目标结点的所有结点. 另一种是自顶向下的splay, 需要在splay
操作时把根结点和目标所在的子结点标记下传. 因为既要找到目标结点在根结点的方向(左子树还是右子树), 又要找到目标结点在子结点的方向.
而标记下传后需不需要维护祖先结点的值呢? 其实不需要过多维护, 因为splay操作自带维护操作——旋转操作里就有.
代码
https://code.csdn.net/snippets/608231
1 0
- CODEVS-3303-翻转区间
- 【CodeVS】3303 翻转区间
- 【codevs 3303】翻转区间 splay
- CODEVS 3243 区间翻转 (SBT)
- CODEVS 1743(伸展树区间翻转)
- codevs 1743 反转卡片【Splay区间翻转】
- CODEVS 1205 单词翻转
- codevs 1205 单词翻转
- Codevs 1205 单词翻转
- codevs 1205单词翻转
- 3303 翻转区间 伸展树的解法
- hdu 3487 区间翻转
- bzoj3223区间翻转
- 4975: 区间翻转
- bzoj 4975: 区间翻转
- Splay区间翻转
- 区间翻转问题 Splay
- codevs 1258(区间dp)
- SSH-struts1登录实例
- Codeforces 390C Inna and Candy Boxes RMQ简单变化 或 前缀和dp一下
- Android 开发学习小结(二)
- Android AlertDialog对话框自定义风格的另类实现
- cocoapods导致的符号重复问题分析和解决
- CODEVS-3303-翻转区间
- Linux 命令16-which命令
- 互联网模式的企业如何运维IT系统(二)
- 再学异常
- Django使用redis做cache
- c_指针_一维数组名作为函数参数
- AJAX调试技术 IE篇
- UVA12108 Extraordinarily Tired Students(超级大模拟)
- 使用事件总线框架EventBus和Otto