摘要: 查询区间第k大可以用划分树,而查询区间最小(最大)值可以用代码更简单的Sparse-Table(ST)算法(Tarjan发明)。 原理很简单,代码也很短: 令d(i,j)表示从i开始的,长度为2^j的一段元素最小值,那么可以用递推方法计算: d(i,j) = min( d(i,j-1) , d(i+2^(j-1) , j-1) ) void RMQ_init(const vector... 阅读全文
posted @ 2016-03-14 15:44 ZhMZ 阅读(670) 评论(0) 推荐(0) 编辑
摘要: 树状数组又叫二叉索引树 参考《训练指南》P194 动态求连续区间和,可以动态更新数据,支持以下两种操作: 1、 对某一元素进行更新操作。 2、 查询某一连续区间的元素和。 对于正整数x,我们定义lowbit(x)为“x的二进制表示中最右边的1所表示的值”,例如lowbit(11001100) =100 (这里的11001100、100都是二进制表示),在程序实现中lowbit(x) = ... 阅读全文
posted @ 2016-03-14 15:24 ZhMZ 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 划分树是一种基于线段树的数据结构。主要用于快速求出(在log(n)的时间复杂度内)序列区间的第k大值。 先看下图已经建好的划分树是什么样子的,原始数组是[1,5,2,3,6,4,7,3,0,0],并把它作为树的第0层,然后把这些数中较小的数再组成[1,2,3,0,0],顺序还是遵照原数组的顺序,同样将较大的数再组成[5,6,4,7,3]。把这两个数组作为树的第二层,它们的父亲则是第一层的原始数组... 阅读全文
posted @ 2016-03-14 15:20 ZhMZ 阅读(379) 评论(0) 推荐(0) 编辑