今天看了点主席树的概念,加上飞哥上次讲的,目前对主席树有了大致的了解,简单谈谈吧,不讲代码,只讲思路,日后贴题!

Orz高级数据结构发明者主席!!最早在CLJ的课件里第一次看到了这个词,最近做区间第K大时又想起了这茬,这方面资料也挺少的,于是再次膜拜下主席,对主席树理解有不到位的地方也欢迎指正。

然后读以下文字时最好有些线段树的预备知识,毕竟根据发明者的原话:“想法是对原序列的每一个前缀[1..i]建立出一颗线段树维护值域上每个数的出现次数,然后发现这样的树是可以减的,然后就没有然后了”

主席树可以用来解决如下问题:“给出一列数,a1,a2…an,每次询问其中连续的一段区间ai到aj其中的第K大的数是多少?”

建那么多的线段树显然会MLE!!但是为了便于理解,这里先把这个岔放下。我们先新开一个数组t[n],其中存着an排序并去重的值。

那么每棵线段树维护的内容是什么呢?是a1到ai这段区间中的数在t[n]中出现的次数。这段话的内容也许有点抽象,举个例子 an:4 1 1 2 8 9 4 4 3

排序并去重后得到{tn}

tn:1 2 3 4 8 9

下面对前缀a[1..9]建树,它有两个1,一个2,一个3,三个4,一个8和一个9,那么它的出现次数便是线段树维护的值(为表示清楚记为Cn)建树完后如下图,树中每个节点的值表示t[i,j]中的数字在a[1..9]中出现的次数和,i,j即为节点下面标出的区间。

下面我们来看对于这棵树如何求第K大值。比如我们求a[1..9]中第6大的数是多少?我们看到根节点的左儿子只有4个元素,那么第6大数一定在右儿子中,并且我们可以把问题递归下去即求区间t[4,6]的三个数中为a[1..9]去除所有数字为t[1],t[2],t[3]后第2大的数是多少。(c[1]+c[2]+c[3]=4,那么6-4=2)。我们看到此时的左儿子(区间t[4,5])有4个元素,4>2,因此第二大数一定在左儿子中,递归进入左儿子,此时即求区间t[4,5]的两个数中

为a[1..9]去除所有数字为t[1],t[2],t[3],t[6]后第2大的数是多少。最后区间[4,4]有三个元素,3>2,所以第二大数一定在区间[4,4]里即t[4]=4,所以a[1..9]中第6大数为4。

这里要记住的是对于每个i , a[1,i]都有一棵树,求a[L,R]的第K大与求a[1,R]的类似,只要在每层递归时减去a[1,L-1]所在树的相应部分即可,比如在a[L,R],小于t[mid]的数有6个,在a[1,L-1] 小于t[mid]的数有2个,那么在a[L,R] 小于t[mid]的数就有6-2=4个,递归过程和上面类似,不再详细展开。

下面解决MLE这个梗。如下图画出a1…5到9为前缀的树,然后发现树的形态都非常像!!

这是我们能够压缩的空间。例如以a[1..9]为前缀建的树的右子树与以a[1..8]为前缀建的树的右子树是相同的!!因此在建树a[1..9]的时候(建树是从1到9的顺序)根节点可以直接向a[1..8]的右子树连一条边。同理,对于根节点的左儿子来说(现在把这个点看做根节点),它的左子树和a[1..8]的相应部分也是相同的,因此也连一条边,如下图所示

这样我们只增加了三个点却保存了两棵树的所有信息!!像这样在前面树的基础上建树,我们只需要开一个数组储存图示两个箭头所指的根的位置就够了,顺着根向下遍历便是如前所述一棵完整的线段树

浅谈数据结构之主席树(线段树进阶版)相关推荐

  1. 树套树-线段树套平衡树

    作用 线段树的作用是区间修改和查询,平衡树的作用是查询第k大,k的排名,前驱,后继.这两个结合起来,就变成了可以区间修改和查询第k大,k的排名,前驱,后继的数据结构:树套树-线段树套平衡树. 实现 先 ...

  2. HDU - 4417 Super Mario(主席树/线段树+离线)

    题目链接:点击查看 题目大意:给出由 n 个数的数列,再给出 m 次查询,每次查询需要输出 [ l , r ] 内小于等于 h 的数有多少个 题目分析:大晚上睡不着觉随便做做题,发现这个题目原来可以用 ...

  3. 数据结构--树--线段树(Segment Tree)

    文章目录 1. 概念 2. 建树 3. 查询 4. 修改 5. 完整代码及测试 上图 from 熊掌搜索 类似数据结构:树状数组 1. 概念 线段树是一种二叉树,是用来表示一个区间的树: 常常用来查询 ...

  4. 【学习笔记】浅谈短小可爱的左偏树(可并堆)

    文章目录 左偏树 左偏树的合并(merge)操作 例题 罗马游戏 [Apio2012]dispatching [JLOI2015]城池攻占 [Baltic2004]sequence 左偏树 左偏树是一 ...

  5. 浅谈数据结构和数据类型

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012540337/article/details/80499226 最近总是被这两个概念混淆,抽出 ...

  6. BZOJ 3685: 普通van Emde Boas树( 线段树 )

    建颗权值线段树就行了...连离散化都不用... 没加读入优化就TLE, 加了就A掉了...而且还快了接近1/4.... ---------------------------------------- ...

  7. 【浅谈数据结构】《数据结构》Data Structure

    <数据结构>60' 一.栈(stack).队列(Queue).向量(Vector) 1.链表 带哨兵节点链表了解清楚 链表要会写,会分析.各种链表. 2.栈 LIFO(last in fi ...

  8. 2021CCPC(桂林) - Suffix Automaton(后缀树+线段树)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串,再给出 qqq 次询问,每次询问需要输出本质不同第 kkk 小的子串的起止位置.如果有多个答案,输出起点最小的那个. 本题规定字符串大小 ...

  9. YbtOJ#752-最优分组【笛卡尔树,线段树】

    正题 题目链接:http://www.ybtoj.com.cn/problem/752 题目大意 nnn个人,每个人有cic_ici​和did_idi​分别表示这个人所在的队伍的最少/最多人数. 然后 ...

最新文章

  1. mongodb cond 模糊查询_为了实现在线库的复杂查询,你还在双写吗?
  2. android自定义离线地图,MapBox GL Android:已下载但未使用的自定义磁贴源的离线地图...
  3. 不再迷惑,无值和 NULL 值
  4. -bash: belts.awk: command not found
  5. c 跟r语言运行速度,1. R语言运行效率分析(5)
  6. 59s计时器C语言程序步骤详解,51单片机00-59秒计时器 0-59s Timer
  7. wampserver启动报错:1 of 2 services running - 解决篇
  8. secureCRT及secureFX安装注册和secureFX中出现中文乱码的处理方式
  9. 随想录(学习消费类soc芯片)
  10. 测试面试题集-Python三局两胜小游戏
  11. Confluence 6 匿名访问远程 API
  12. airpods pro连接安卓声音小_安卓手机用 AirPods ?你需要这个 App
  13. 使用SubSonic生成数据访问层步骤
  14. Windows 7下的虚拟光驱
  15. 苹果电脑各型号支持的macOS版本列表
  16. 图灵学院Java架构师课程,基于java
  17. rips php,审计PHP工具篇之 RIPS
  18. python进行表白,画爱心
  19. 有关数据库sql语句基础小白初学者可学(持续更新)
  20. 你真的知道什么是元音什么是辅音吗?

热门文章

  1. WARNING: IPv4 forwarding is disabled. Networking will not work.解决方法
  2. android检测是否跳出应用程序,android – 检测应用程序何时打开/恢复
  3. linux-如何限制普通用户的磁盘使用空间-磁盘配额quota,Linux-如何限制普通用户的磁盘使用空间-磁盘配额quota...
  4. linux中paste的用法,在Linux中使用Paste命令来合并行,包括使用Paste命令技巧及注意事项...
  5. java执行完main就结束了吗_为什么main方法中执行完第一个方法完之后,后面的代码都不执行了?...
  6. sql server无法绑定由多个部分组成的标识符_HTML5服务器推送事件(Server-sent-event)...
  7. cdr放大后内容消失了_今日推荐:AI智能图片清晰放大神器强势来袭,简直无敌了...
  8. ‘dict’ object has no attribute 'has_key'
  9. Cannot forward after response has been committed问题解决及分析
  10. ROS学习笔记01:安装ROS - 玩小海龟