POJ 2104 归并树 or 划分树

归并树与划分树是数据结构中的两种操作,划分树是归并树的逆过程。对于每个区间,划分树会将其分成两个部分,分别存储较小和较大的一半。每层的节点都记录其左侧有多少元素进入了左子区间,以辅助查询。查询时,根据初始区间中进入左子区间的元素数量调整后续查询范围。如需深入了解,请参考小hh大牛的博客。
摘要由CSDN通过智能技术生成
首先写一下归并树的版本吧
归并树实际上是一种类似于归并排序外加线段树的东西
用到线段树的地方就是划分区间。
我们都知道,线段树是一层一层这样下来的,每层上有若干个区间。
归并树的作用就是,对每一层上的所有区间,其内部都是排好序的。
也就是说,第一层是所有数排好序,第二层划分了两个子区间,两个子区间内部都是排好序的。依次直到叶子结点
当然,建树的过程跟线段树是一样的,只不过在递归的过程中要将子区间的信息归并到父区间时要是用归并排序的归并操作。


建好树之后就是查询操作了
这就要说到这道题的另一个做法,快排的做法
快排做法就是把序列进行排序,然后每次询问,都把序列扫一遍,用一个变量表示扫到了查询区间的第几小的数,如果一个位置属于查询区间的,就自增,这样直到变量为K时结束
因为我们已经排好序了,所以这种做法必然是可行的。只不过实在是速度太慢。
归并树的做法也是基于这种思想来搞的。
只不过建树后就可以进行二分操作。
我们还是先排好了序,然后二分,看二分的这个值在查询区间中能排到第几小,当查询到某个值使得在查询区间中恰好为第K小时,即为所求。
那么怎么计算他在查询区间中排第几呢,用到了归并树。
在归并树中,你查询的区间必然能被树上某些区间的并来表示,在这些区间当中,由于我们已经排好了序,所以又可以进行二分查找,来找出比我们第一层二分的值小的元素有多少个。
注意,第一层二分的值很有可能不在查询区间中,而也为查询区间的第K小,这就要我们取那个从k-1刚变为k时的那个值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值