关于 (主席树) (可持久化线段树) (动态开点线段树) 的问题
2017-01-05 10:58
295 查看
问题
主席树、可持久化线段树、动态开点线段树指向的都是同一类问题。即给定一个序列,求与等级、名次相关的答案,常用线段树计数加减的方式解决,在需要的时候也可以对等级、名次对应的数值离散化,前提是没有修改或允许离线操作算法原理
为了解决此类问题,需要对每个序列节点建一棵以询问目标大小为值域的线段树,每一棵线段树都有一个它对应的前驱线段树,并成为此前驱的扩展和延伸。例如(poj2104 kth number),对于求解区间第k大(小)问题,对给定的整个序列的每个点建权值线段树,树的值域可以是离散化或非离散化后的点的数值的值域,线段树维护一个size域,即在序列1~i中出现的在数值区间[l,r]中的数的个数,因此每个任意点i的线段树的前驱线段树就是点i-1的线段树,因此每棵线段树可以看作一个前缀和的处理。若要处理序列区间[a,b]的区间第k大(小),把线段树(b)和线段树(a-1)的权值和相减就可以得出序列区间的权值和了。
例如(bzoj2588 count on a tree),对于求解树上第k大(小)问题,可以解构整棵树,用倍增或树链剖分或dfs序处理整棵树(甚至是森林),那么,我们就要对每个节点建权值线段树,此时的前缀和就是根节点到该子节点的权值前缀和了。要注意,这里求解节点u到v的权值第k大,即求解线段树(u)+线段树(v)-线段树(lca(u,v))-线段树(fa(lca(u,v)))。
时间复杂度大概都是O(n * log2 (len))的,空间复杂度理论上也是O(n * log2 (len)),但是如果是用静态存储池来开点一般要开两倍的空间,动态的话就不说了,那很容易re。
算法应用
此类数据结构可以解决名次类的静态乃至动态的区间型问题,如第k大、中位数乃至树上的问题具体的问题详见http://www.cnblogs.com/keshuqi/category/925236.html
相关文章推荐
- 【可持久化线段树】【主席树】[BZOJ 3295]动态逆序对
- 关于统计的一个sql问题,使用动态sql语句实现。
- 关于DataGrid的动态排序问题
- 关于动态数组、静态数组转换为字符串的一些问题 - 给 "厨师" 的回复
- asp.net定义用户控件时,属性持久化和如何动态加载的问题
- 关于SQL中 动态执行SQL语句并且获得动态SQL语句输出参数值的问题
- PB中关于动态工资项目问题的解决办法
- 关于动态窗口的释放和ThemeEngine的问题
- 关于动态生成控件的访问问题
- 关于TClientDataSet创建动态表的问题
- 关于ASP动态网站的问题
- JavaScript 关于动态添加表格行问题
- 关于动态代理的问题
- 关于ASP.NET中动态生成控件问题,急求解决!
- 关于统计的一个sql问题,使用动态sql语句实现。
- 关于Laszlo(2.x 3.0)无法动态加载资源的问题
- W3C的HTML工作组主席Steven pemberton回答的关于XHTML的常见基础问题
- 关于视图状态(ViewState)/动态控件的问题
- 总结一下关于编程动态修改SiteMap的问题
- 既然在 关于动态写入表格问题的扩展 中提到了iFrame,咱就不能不说说iFrame高度自适应问题