无旋treap的区间操作实现
最近真的不爽。。。一道维修数列就做了我1上午+下午1h+1晚上+晚上1h+上午2h。。。
一道不错的自虐题。。。
由于这一片主要讲思想,代码我放这里了
不会无旋treap的童鞋可以进这里
呵呵。。。
下面来切开这道题
1、建立一个treap
肯定不能做n次merge吧。。。虽然我看见有人这样写过了,但我毕竟自带巨大常数
这里可以这么做
用一个栈来维护新建treap最右边的一条链(右下角是栈顶),从左到右依次加点,每次只需将这个点的rand与栈顶的rand比较一下,如果栈顶的rand比要加的当前点的rand大,就一直退栈(小根堆),然后把这个点设为栈顶的右儿子,把最后一次退栈的的点设为当前点的左儿子。(当前点即为要加的点)
入栈完成后,将所有点退栈。最后一次退栈的即为根。
每个点退栈前要reset(其他文章的updata)
然后就建好了一个treap。。。
2、插入操作
很容易。。。merge n次,肯定是对的,但不保证不会T。。。
这和建树差不多。。。所以可以先建一棵树,然后与原树合并
3、删除操作
额,和单点差不多,把要删除部分分离出来再merge剩下部分。。。
4、修改操作
像线段树一样维护一个标记,当要修改(即merge或split)时更新数值并下传标记
5、翻转操作
像线段树一样维护一个标记,当要修改时交换左右儿子并下传标记
6、求和操作
每个节点维护一个sum,每次更新时更新sum,sum=data+ls.data+rs.data
7、求最大子序列操作
有点麻烦。。。不过还是可以做
每个点维护三个:最大前缀,最大后缀,和最大子序列
转移方程:
lmax=max(ls.lmax,ls.sum+data+max(rs.lmax,0))
rmax=max(rs.rmax,rs.sum+data+max(ls.lmax,0))
maxx=max(ls.maxx,r.maxx,data+max(ls.maxx,0)+max(rs.maxx,0))
这个转移方程正确性显而易见。
还有就是修改操作时,要修改这个标记,如果修改的数是正数,修改成size*data,否则修改成data(必须选一个。。。)
还有反转时交换lmax,rmax
8、关于空间
我是非指针党,空间肯定炸,所以我弄了个栈,里面装没用的空间,当建树时弹栈再用。。。当删除时回收,全部重新入栈
然后就解决了这道题。
补充:
1、updata时必须先让左右儿子下传标记
2、随机数不能重复!!!
3、指针版
无旋treap的区间操作实现的更多相关文章
- [转载]无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )
转自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182631.html 1500: [NOI2005]维修数列 Time Limit: 10 Sec Mem ...
- [您有新的未分配科技点] 无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MB Description Input 输入的第1 行包含两个数N 和M(M ≤20 ...
- 【序列操作V】平衡树(无旋treap)
题目描述 维护一个队列,初始为空.依次加入 n(1≤n≤105)个数 ai(-109≤ai≤109),第 i(1≤i≤n)个数加入到当前序列第 bi(0≤bi≤当前序列长度)个数后面.输出最终队列. ...
- [转载]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
转载自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182491.html 今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和t ...
- [您有新的未分配科技点]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和treap一样简单易懂,同时还支持可持久化. 无旋treap的节点定义和treap一样,都要同时满足树性质和堆性质,我 ...
- 【算法学习】Fhq-Treap(无旋Treap)
Treap——大名鼎鼎的随机二叉查找树,以优异的性能和简单的实现在OIer们中广泛流传. 这篇blog介绍一种不需要旋转操作来维护的Treap,即无旋Treap,也称Fhq-Treap. 它的巧妙之处 ...
- [BZOJ3223]文艺平衡树 无旋Treap
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个 ...
- 无旋Treap - BZOJ1014火星人 & 可持久化版文艺平衡树
!前置技能&概念! 二叉搜索树 一棵二叉树,对于任意子树,满足左子树中的任意节点对应元素小于根的对应元素,右子树中的任意节点对应元素大于根对应元素.换言之,就是满足中序遍历为依次访问节点对应元 ...
- 无旋treap大法好
无旋Treap大法好 原理? 是一棵二叉查找树: 一个节点左子树权值都比他小,右子树权值都比他大 所以可以维护序列(以位置为权值),或数值(以数值为权值) 是一个堆: 每个节点除了上述提到的权值外,还 ...
随机推荐
- centos7源码安装vim8.0
centos 6和7通过yum安装的vim版本仍为7.4,若想尝鲜,可获取源码包编译安装. 准备工作 1.检查vim旧版本,若已存在,将其卸载. $ vim$ yum remove vim* -y 2 ...
- Hadoop学习之路(二十七)MapReduce的API使用(四)
第一题 下面是三种商品的销售数据 要求:根据以上数据,用 MapReduce 统计出如下数据: 1.每种商品的销售总金额,并降序排序 2.每种商品销售额最多的三周 第二题:MapReduce 题 现有 ...
- python过滤文件中特殊标签
Beautiful Soup Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(parse tree). 它提供简单又常用的导航( ...
- pymongo的安装和使用
1.安装 MongoDB的python接口pymongo的安装方法有多种,如源码.easy_install.pip都可以.采用pip安装,很简单. pip install pymongo 安装完成后可 ...
- Visual Studio 2017 安装过程问题解决
VS已经发布了两三天了,我也着手安装,但是折腾了两个晚上,怎么都到不了安装界面(选择模块的界面),各种尝试,各种重启,也并不顶什么卵用~ 后来经过各种查LOG,发现我电脑访问不了https://dow ...
- java alibaba fastJson 遍历数组json
import java.util.*; import com.alibaba.fastjson.*; public class Test { public static void main(Strin ...
- Python 学习笔记(十四)Python类(一)
基本概念 问题空间:问题空间是问题解决者对一个问题所达到的全部认识状态,它是由问题解决者利用问题所包含的信息和已贮存的信息主动的地构成的. 初始状态:一开始时的不完全的信息或令人不满意的状况: 目标状 ...
- Oracle数据库对表基本的操作--增删查改
--向student表中加入入学时间属性,其数据类型为日期型alter table student add scome date; --删除student表中的入学时间属性alter table st ...
- 在 Oracle Linux 6.5 上安装 Oracle 11g 单实例数据库
Checking the Hardware Requirements 系统必须满足下面最小的硬件要求 Memory Requirements Minimum: 1 GB of RAMRecommend ...
- C++练习 | 创建并倒序输出不带头结点的链表
#include <iostream> #include <cstdio> #include <stdlib.h> #include <stack> u ...