摘要: 1. 二分查找容易死循环,注意 (low+high+1 )/2 , 以及 mid = high-1 或者 mid = low+12. 最小或者最大等极限情况要做特殊处理3.手工调试程序结束后一定要删除检测语句思路: 用线段树记录归并排序的过程,那么(1)可以在log(n)时间内查找到 任意数c 在区间(i,j)之间的 名次, 也就是区间内比c小的数的个数+1,(2)从而我们可以通过二分x来找到在区间(i,j)排名为k的数,注意满足此条件的数可能不止一个,举例 区间数列为{3, 7,7, 5} k=4那么满足排名3为的数有5,6,7, 显然我们要找的是7(1)过程的也需要二分查找,只需要记录比c 阅读全文
posted @ 2012-08-05 18:10 何解一直犯相同错误? 阅读(251) 评论(0) 推荐(0) 编辑
摘要: 学习了网上最常用的解法——归并树。所谓的归并树并不是什么新奇的东西,顾名思义,其实就是归并排序+线段树。把归并排序过程中的各区间排序后的结果,用线段树储存起来!对题目给定的区间,只要在线段树中查找组成该区间的各个子区间即可!——logN关键在于求出某个值在线段树各个子区间中,小于该值的元素个数,还是用到了二分,继续是logN。由于要求的是该区间的第k小元素,可以对整个排序完的数组进行二分查找,当某元素在该区间中排第k小,并且该元素属于该区间,即为答案。对排序数组进行二分查找,也是logN。耗时:2500ms+#include<stdio.h>#define N 100010stru 阅读全文
posted @ 2012-08-05 18:09 何解一直犯相同错误? 阅读(350) 评论(0) 推荐(0) 编辑
摘要: 线段树 相信对算法设计或者数据结构有一定了解的人对线段树都不会太陌生。它是能够在log(MaxLen)时间内完成线段的添加、删除、查询等操作。但一般的实现都有点复杂而线段树应用中有一种是专门针对点的。(点树?)它的实现却非常简单。 这种数据结构有 什么用?我们先来考虑一下下面的需求(全部要求在LogN时间内完成):如何知道一个点在一个点集里的大小“排名”?很简单,开一个点数组,排个序,再二 分查找就行了;如何在一个点集内动态增删点?也很简单,弄个平衡树就行了(本来平衡树比线段树复杂得多,但自从世界上有了STL set这么个好东东,就……^_^)那如果我既要动态增删点,也要随时查询到一个点的.. 阅读全文
posted @ 2012-08-05 18:07 何解一直犯相同错误? 阅读(277) 评论(0) 推荐(0) 编辑
摘要: 1. 二分查找容易死循环,注意 (low+high+1 )/2 , 以及 mid = high-1 或者 mid = low+12. 最小或者最大等极限情况要做特殊处理3.手工调试程序结束后一定要删除检测语句思路: 用线段树记录归并排序的过程,那么(1)可以在log(n)时间内查找到 任意数c 在区间(i,j)之间的 名次, 也就是区间内比c小的数的个数+1,(2)从而我们可以通过二分x来找到在区间(i,j)排名为k的数,注意满足此条件的数可能不止一个,举例 区间数列为{3, 7,7, 5} k=4那么满足排名3为的数有5,6,7, 显然我们要找的是7(1)过程的也需要二分查找,只需要记录比c 阅读全文
posted @ 2012-08-05 18:03 何解一直犯相同错误? 阅读(193) 评论(0) 推荐(0) 编辑