我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:2019年香港六彩全年资料 > 区间查询 >

如何用线段树实现区间查找第k值?

归档日期:08-15       文本归类:区间查询      文章编辑:爱尚语录

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  2013-07-26展开全部线段树(SBST): 定义:一种高效的数据结构,通过对区间进行操作,来达到解决问题的目的。支持插入、查找、删除操作。 插入:寻找该点或该区间所在的区间,然后把值插入,直至元区间。查找:同上。删除:同上。 流程:建树(MakeTree)、插入(Insert)、查找(Find)、删除(Delete) 效率:建树时间O(nlogn),其他都是在logn内完成。空间会开销的比较大,但是时间因此也好了很多。 例1:Ural1028星星,同BST中的解法一样,但是这里的查找效率要高的多,每次为x经过的区间累加访问次数,若x在某点往右走,则该点左儿子的访问次数就是比该点小的个数,直至x到达元区间,计算一路比x小的个数。插入,查找一起进行,时间复杂度nlogn。 例2:Ural1037内存管理,此题比较麻烦,首先把树的元区间建立成[x,x]这种类型,然后每个区间都有一个最早更新时间、访问次数、儿子数。对于申请内存,若该某结点左儿子的访问次数不足它儿子的个数,则往左走。若满足了,则查看最早更新时间,如果两者相差超过600秒则往左走。若两个条件都不满足,则向右走。到了元区间,则更新该点的最早更新时间为当前时间,然后更新其父亲,在左右儿子中选一个时间最早的时间作为其父亲的更新时间,若父亲被更新则更新父亲的父亲,直至根。对于使用内存操作,则根据关键字找到元区间,若满足判断条件则输出+,然后更新最早更新时间,否则输出-。利用线段树,虽然空间占用了近70000的数组,但时间很优化。 {Ural1028,星星}

  {思想:因为数据是按Y的升序,Y相同按X升序排列的,所以不需要再次排序。这样,就可以忽略Y坐标,从1到N,仅计算X坐标,每次都在当前线段树上寻找小于等于X的个数,然后再将X插入线段树。这样,横和纵坐标都比第i个结点小的个数就出来了,再加入结果中。}

  inc(sbt[t].d); {因为X经过了此线段,则累加当前结点的经过次数}

  t:=insert(x[i],1); {将第i个数据的X坐标插入线段树,计算比X小的数据有多少个}

  init; {读入数据,若数据不是顺序的,则按Y的升序排列,若Y相同则按X的升序排列}

  {d是经过次数,a是左边的值,b是右边的值,l是左儿子,r是右儿子,t是时间,f是父亲}

  {如果该点的更新时间距离time超过600或者此点的经过次数不够则访问左儿子,否则访问右儿子}

本文链接:http://mpragency.com/qujianchaxun/710.html