RMQ(Range Minimum/Maximum Query),即区间最值查询

查询很多的时候求[l,r]的最大值可以弄一个数组f[i,j]表示i~j的最大值

//这个是线段树

rmq是f[i,j]表示   i 到 i+2^j-1 这个区间的最大值

/*给例子好理解

 比如f[i,0]  =  a[i]  然后先要预处理这个f  方法是DP
 f[i,j] = max( f[i,j-1] , f[ i + (1<<j-1) , j-1] )
相当于是二分
比如  2,4其实是2,18
那么 2~ 18 中间有16个数
我们求2~18的最值等于 2~10 和 11~18的最值的
最值用 rmq表示就是f[2,3]
初始化条件就是f[i,0]=a[i]
有了初始化有了动态转移方程就可以得到f了
现在假设来了一个请求 l~r
那么我们先要得到一个区间的大小就是r-l+1
找到一个K
这个K是 2^K<=r-l+1 的最大的K
然后就是ans=  max( f[l,k], f[r-(1<<k)+1,k])
假设是2~20区间长度是19K=4
就是 f[2,4]  f[4,4]
换成线段树的表示就是
f[2,18] f[4,20]
这2段的最值就是f[2,20]的最值了
虽然有重复的部分 但是不影响
*/
 
 
 

LCA(最近公共祖先)
 
LCA就是把问题转化为RMQ
转化过程如下:
一棵树,我们对它先进行DFS,记录下路径
比如上图的这颗树(图来自百度,侵删)
DFS的结果是1 3 1 2 4 2 5 6 5 7
深度就是1 2 1 2 3 2 3 4 3 4
仔细想想会得到求 i~j 的路径就是上面那个路径的子集 
//其实这个路径没写完整 后面还有1 3 1 2 4 2 5 6 5 7 5 2 1
 
 
记录深度和路径以及每一个节点第一次到达的时候一共走了几步
 //对于1 2 3 4 5 6 7来说 他们分别是1 4 2 5 7 8 10
然后问题要求是求路径
比如求4 ~7  查一下
4第一次出现是5
7第一次出现是10
那么问题就是求1 3 1 2 4 2 5 6 5 7 5 2 1这个里面的第五个到第十个4 2 5 6 5 7
深度对应的是这6个数字 3 2 3 4 3 4
深度最小的那个就是他们的公共父节点
深度为2的那个路径上的2
问题就变成了求区间
假设:

路径是path[] 深度是dep[] 首次出现是first[]
求i~j就变成了f [ dep [ first[ i ] ] , dep [ first[ j ] ] ]

假设结果是 __min
在这段区间上搜索一下
if f[i]= __ min
那么保存i
公共父节点就是 path [ i ]
 

RMQ和LCA的更多相关文章

  1. 【RMQ】洛谷P3379 RMQ求LCA

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  2. RMQ求LCA

    题目链接 rmq求LCA,interesting. 一直没有学这玩意儿是因为CTSC的Day1T2,当时我打的树剖LCA 65分,gxb打的rmq LCA 45分... 不过rmq理论复杂度还是小一点 ...

  3. BZOJ1906树上的蚂蚁&BZOJ3700发展城市——RMQ求LCA+树链的交

    题目描述 众所周知,Hzwer学长是一名高富帅,他打算投入巨资发展一些小城市. Hzwer打算在城市中开N个宾馆,由于Hzwer非常壕,所以宾馆必须建在空中,但是这样就必须建立宾馆之间的连接通道.机智 ...

  4. poj 1330 Nearest Common Ancestors(LCA 基于二分搜索+st&rmq的LCA)

    Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 30147   Accept ...

  5. dfs序+RMQ求LCA详解

    首先安利自己倍增求LCA的博客,前置(算不上)知识在此. LCA有3种求法:倍增求lca(上面qwq),树链剖分求lca(什么时候会了树链剖分再说.),还有,标题. 是的你也来和我一起学习这个了qwq ...

  6. 数据结构 《18》----RMQ 与 LCA 的等价性 (一)

    前言     RMQ: 数组 a0, a1, a2,..., an-1, 中求随意区间 a[i+1], a[i+2], ..., a[i+k] 的最小值     LCA: 求二叉树中两个节点的最低公共 ...

  7. LOJ#137. 最小瓶颈路 加强版(Kruskal重构树 rmq求LCA)

    题意 三倍经验哇咔咔 #137. 最小瓶颈路 加强版 #6021. 「from CommonAnts」寻找 LCR #136. 最小瓶颈路 Sol 首先可以证明,两点之间边权最大值最小的路径一定是在最 ...

  8. hdu 2586 欧拉序+rmq 求lca

    题意:求树上任意两点的距离 先说下欧拉序 对这颗树来说 欧拉序为 ABDBEGBACFHFCA 那欧拉序有啥用 这里先说第一个作用 求lca 对于一个欧拉序列,我们要求的两个点在欧拉序中的第一个位置之 ...

  9. st表、RMQ和LCA

    int lca(int x,int y) { if(de[x]<de[y]) swap(x,y); int d=de[x]-de[y]; for(int i=log2(d);i>=0;i- ...

随机推荐

  1. jquery.fullCalendar官方文档翻译(一款小巧好用的日程管理日历, 可集成Google Calendar)

    1. 使用方式, 引入相关js, css后, $(‘#div_name’).fullCalendar({//options});  接受的是一个option对象 2. 普通属性 2.1. year, ...

  2. [大牛翻译系列]Hadoop(20)附录A.10 压缩格式LZOP编译安装配置

    附录A.10 LZOP LZOP是一种压缩解码器,在MapReduce中可以支持可分块的压缩.第5章中有一节介绍了如何应用LZOP.在这一节中,将介绍如何编译LZOP,在集群做相应配置. A.10.1 ...

  3. js日期相关函数总结分享

    一个倒计时程序,因为经常要在手机端访问,所以没有引用jquery,对于用习惯jquery的我还真不习惯. 下面简单说明js日期相关函数,并说明实现倒计时的原理 var dateTo=new Date( ...

  4. 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)

    AsyncTask使用方法详情:http://www.cnblogs.com/zzw1994/p/4959949.html 下拉开源框架PullToRefresh使用方法和下载详情:http://ww ...

  5. Global::validateEmail

    /***************************************************************** (C) Copyright DENTSPLY Internatio ...

  6. mysql时间处理

    两种方式,一个是在数据库查询的时候就截取,另一个就是在使用的时候截取. 1.数据库 select date_format(日期字段,’%Y-%m-%d’) as ‘日期’ from test 2.ja ...

  7. python操作mysql之pymysql

    pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持3.x版本. 本文测试python版本:2.7.11.mys ...

  8. js执行上下文(由浅入深)

    每一个函数都有自己的执行上下文EC(执行环境 execution context),并且每个执行上下文中都有它自己的变量对象VO(Variable object),用于存储执行上下文中的变量 .函数声 ...

  9. XAML 概述三

    通过对前面2节对XAML的介绍,我们对XAML有了一定的认识.这一节我们来简单了解一下部分XAML命名空间(x:)语言功能. x命名空间映射的是http://schemas.microsoft.com ...

  10. Java反射在JVM的实现

    1. 什么是Java反射,有什么用?反射使程序代码能够接入装载到JVM中的类的内部信息,允许在编写与执行时,而不是源代码中选定的类协作的代码,是以开发效率换运行效率的一种手段.这使反射成为构建灵活应用 ...