LCA的RMQ求法】的更多相关文章

参考博客 仔细想一想:最近的公共祖先,其实,搜索时回朔,连通这两点,那深度最低肯定是最近的公共祖先啊. 那这样就可以变成RMQ问题了. #include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> using namespace std; ; int ip,tot; struct Tree{//树 int to; int next; int v; }; ]; int f…
下面写提供几个学习LCA和RMQ的博客,都很通熟易懂 http://dongxicheng.org/structure/lca-rmq/ 这个应该是讲得最好的,且博主还有很多其他文章,可以读读,感觉认真读了这篇,都不太需要看别的资料了,百度和谷歌搜索的第一位都是他,好东西大家一起学习 http://scturtle.is-programmer.com/posts/30055 这个博客讲LCA的Tarjan算法个人觉得是比较好的,我看这篇文章,看了1个小时就搞懂了LCA的Tarjan,谢谢博主.可…
题意:给定n个点,下面n-1行 u , v ,dis 表示一条无向边和边权值,这里给了一颗无向树 下面m表示m个询问,问 u v n 三点最短距离 典型的LCA转RMQ #include<stdio.h> #include<string.h> #include<math.h> #define N 100000 #define INF 1<<29 #define Logo 17 using namespace std; inline int Min(int a…
参考: 1. 郭华阳 - 算法合集之<RMQ与LCA问题>. 讲得很清楚! 2. http://www.cnblogs.com/lazycal/archive/2012/08/11/2633486.html 3. 代码来源yejinru 题意: 有一棵树, 按照顺序给出每条边, 再给出若干对点, 这两点之间的唯一的路( Simple path )上边权加1. 当所有对点处理完后, 按照边的输入顺序输出每条边的权. 思路: LCA问题. 最近公共祖先(Least Common Ancestors…
这个博客写得好 #include <stdio.h> #include <vector> #include <string.h> using namespace std; ; /* lca 转RMQ 询问u和v的lca 我们保存树的遍历序列,那么只要在序列中找到第一次出现u和第一次出现v的位置 然后RMQ该区间深度最小的那个点就是u和v的lca了 那么要保存每个点首次出现的位置 还要保存遍历序列的dep序列,然后RMQ dep序列得到哪一位置的dep最小 然后映射为结点…
题意: n个点 m个询问 下面n个数字表示点权值 n-1行给定一棵树 m个询问 k u v k为0时把u点权值改为v 或者问 u-v的路径上 第k大的数 思路: LCA转RMQ求出 LCA(u,v) ; 登山坡式找到路径上所有点并记录其权值 排序输出k大的数 #include<iostream> #include<stdio.h> #include<algorithm> #include<string> #include<queue> #incl…
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每行包含两个正整数x.y,表示x结点和y结点之间有一条直接连接的边(数据保证可以构成树). 接下来M行每行包含两个正整数a.b,表示询问a结点和b结点的最近公共祖先. 输出格式: 输出包含M行,每行包含一个正整数,依次为每一个询问的结果. 输入输出样例 输入样例#1: 5 5 4 3 1 2 4 5…
题意:n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间, 表示点的标号请你求出两个区间内各选一点之间的最大距离,即你需要求出max{dis(i,j) |a<=i<=b,c<=j<=d} n<=100000 len[i]<=100000 思路:两年前张老师出的模拟赛里的题 设区间[a,b]中最大距离点对为[x1,y1] [c,d]为[x2,y2] 则两区间各取一个点的最值只有两两组合4种可能 而线段树中pushup有6种,可以在同一个区间中取两点 求LCA需要…
一.什么是LCA? LCA:Least Common Ancestors(最近公共祖先),对于一棵有根树T的任意两个节点u,v,求出LCA(T, u, v),即离跟最远的节点x,使得x同时是u和v的祖先. 二.算法分类 求LCA的算法很多,按照是否在线可以分为在线算法和离线算法.      在线算法:用比较长的时间做预处理,但是等信息充足以后每次回答询问只需要用比较少的时间.      离线算法:先把所有的询问读入,然后一起把所有询问回答完成,不是本文所讲,Click here 三.在线算法 (…
题意:给定一棵树,求任意两点之间的距离. 思路:由于树的特殊性,所以任意两点之间的路径是唯一的.u到v的距离等于dis(u) + dis(v) - 2 * dis(lca(u, v)); 其中dis(u)表示u到根节点的距离. RMQ求LCA,过程如下,摘自http://dongxicheng.org/structure/lca-rmq/ 在线算法DFS+ST描述(思想是:将树看成一个无向图,u和v的公共祖先一定在u与v之间的最短路径上): (1)DFS:从树T的根开始,进行深度优先遍历(将树T…