【划分树】求区间K大数
来源:互联网 发布:手工腰带 淘宝 编辑:程序博客网 时间:2024/06/08 03:44
求区间K大数,众所周知有二分答案+树套树的做法,每个询问复杂度为O(log3N),可谓近似一个O(N)了,不仅时间复杂度高,编程复杂度也不低,后来才发现还有一种叫划分树的数据结构,专门做这种问题。
本来觉得知道个树套树就够了,据我所知划分树还不支持区间修改操作,但是这次NOI一试的piano偏偏那出题人就有这么重口味,给你来两个500000的点!真是不简单,当时我都在想有没有O(N)的算法了。树套树的复杂度偏偏就被卡掉了,三个点平均每个点要跑5秒,好吧,那就学学划分树把。
看了划分树以后觉得是继后缀数组以来第二巧妙的数据结构,划分树中的节点代表的区间并不是原数组的区间,而是在排序以后数组的区间,通过分治的思想解决问题。
刚开始看划分树还觉得比较飘,对于每一个区间中的每一个节点,要记录一个从这个节点到这个节点所在的区间的左端点之间有多少个进入了左子树(这个区间中前mid小的数进入左子树,其他右子树),这个值很关键,我就可以O(1)的知道我所查找的区间的数是在左子树还是在右子树了。
建树很好写,主要是查找的式子比较长,下面简略的写下:
(rs是区间左端点到我要查询的右端点之间进入左子树的个数,ls是区间左端点到我要查询的区间左端点之间进入左子树的个数,因此我就可以知道我要查询的区间有多少进入左子树的,从而知道我是要递归进左子树查询还是递归进右子树查询)
代码依旧玩缩行流,60行,happy~happy(这道题是poj2104)
- 【划分树】求区间K大数
- POJ2104-K-th Number-求区间第K大数(暴力or归并树or划分树)
- POJ2104 K-th Number 划分树求区间第K大数
- poj 2104 划分树(查询区间第k大数)
- poj2104 求区间第k大数(划分&&主席--待补)
- 划分树——求区间第k大值
- 划分树(求区间第k小值)
- POJ2104:划分树求区间第k小
- 主席树 求区间第k大数(可修改)
- POJ 2104 K-th Number(区间第k大数)(平方分割,归并树,划分树)
- 小白算法练习 POJ 2104 K-th 区间K大数 划分树
- 划分树的学习(求区间第k大的数字)&&分块求区间第k大
- 区间第K大数——划分树(POJ2104解题报告)
- 划分树学习小记 Poj 2104+Poj 2761+Hdu 2665 (区间第k大数)
- POJ 2104-K-th Number(划分树)求区间内第k小的数
- pku2104 第k大数-划分树做法
- 划分树求第k大数
- 划分树求第K大数
- 总结
- 总结
- STL入门教程一:vector的使用
- Send "aaa" to NotePad through handle
- 开发人员必备网站分享
- 【划分树】求区间K大数
- Struts学习小结 一
- Linux的帧缓冲设备
- java线程同步原理及wait,notify的用法及与sleep的区别
- Makefile.am, Makefile.in 与 Makefile的关系
- 做个诚信的客户难,做个诚信的老板难,做个诚信的程序员更难,大家需要诚信的社会环境
- 开发人员的不断流动、让我们更加坚定信念,一定要控制好整个系统的底层架构、核心设计、日常质量检查工作
- 稳扎稳打Silverlight(46) - 4.0UI之FlowDirection, TextTrimming, 响应鼠标滚轮事件, 响应鼠标右键事件, 全屏的新特性
- C#制作WinForm控件