区间最深LCA】的更多相关文章

求编号在区间[l, r]之间的两两lca的深度最大值. 例题. 解:口胡几种做法.前两种基于莫队,第三种是启发式合并 + 扫描线,第四种是lct + 线段树. ①: 有个结论就是这个答案一定是点集中DFS序相邻的两个点的lca.于是开个数据结构,以DFS序为key维护点集,找前驱后继,额外用一个数据结构维护所有lca的深度,取最大值即可.外面套莫队就做完了. 实现上这两个数据结构都可以用树状数组. #include <bits/stdc++.h> #define out(a) std::cer…
题目hdu5266 分析:多节点的LCA就是dfs序中最大最小两个节点的LCA.所以只要每次维持给出节点的dfs序的最大最小,然后就是两点的LCA 代码: rmq的st+lca的倍增 #include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> #include<math.h> //#include<bits/stdc++.h> using na…
RXD, tree and sequence Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 234    Accepted Submission(s): 82 Problem Description RXD has a rooted tree T with size n, the root ID is 1, with the dep…
A. Anniversary Cake 随便挑两个点切掉就好了. #include<bits/stdc++.h> using namespace std; const int Maxn=200020; typedef long long LL; typedef pair<int,int>pi; pi a[2]; int main() { freopen("anniversary.in","r",stdin); freopen("an…
http://www.lydsy.com/JudgeOnline/problem.php?id=3757 题意:n个节点的树,每个点有一种颜色.现有m种询问,每次询问x y a b表示x到y的路径上颜色的种数且a颜色看成b颜色.(n<=50000, m<=100000) dfs序序列分块战术核导弹= =: #include <bits/stdc++.h> using namespace std; const int N=50005, M=100005; inline int get…
给出一棵有根树,1为根结点,接下来q次询问,每次给出一个[l,r]区间,现在允许删掉[l,r]区间内任何一个点,使得所有点的最近公共祖先的深度尽可能大,问删掉的点是哪个点,深度最大是多少. 做法: 线段树维护区间dfs序的最大值,最小值. 首先,区间的LCA等价于区间dfs序的最小值和最大值对应的两个点的LCA. 然后,根据dfs序的性质,当删掉的点的dfs序最大或者最小时,对答案贡献最大. 所以接下来只要去查询区间里的LCA(最小值,次大值),以及LCA(次小值,最大值),两个LCA中深度最大…
我好菜啊...... %%%迪神AK 虽然考试成绩不太好,但至少能想到正解了,也不会菜到打不出暴力. T1:想了半天不会,发现直接打高精可以拿到80分,就赶紧码完扔了,结果正解是利用double避免了高精运算 解法:%%迪神,高精压位,同时只记录前300位进行比较. or利用double和除法,最后和1比较 or正解:double,对所有数取log再进行比较 #include<iostream> #include<cstdio> #include<cstring> #i…
题目链接 pog loves szh III 题意就是  求一个区间所有点的$LCA$. 我们把$1$到$n$的$DFS$序全部求出来……然后设$i$的$DFS$序为$c[i]$,$pc[i]$为$c[i]$的反函数. 区间的$LCA$其实就是,$DFS$序最大和最小的两个点的$LCA$. (话说$2017$女生赛里面有一题要用的结论和这题的差不多) 然后求出区间的$DFS$序最大值$x$和最小值$y$. 然后求一下$LCA(pc[x],pc[y])$即可. #include <bits/std…
题意:一棵树,俩种操作:1 有路径上的全部点加vi,2全部边加vi. 先离线求出全部询问的lca,再遍历询问一次,点+vi,lca-2*vi ,最后dfs从叶子扫上来一次,最后再祖先点补上就可以.用了输入挂. 复杂度(n+m). #pragma comment(linker,"/STACK:10240000000000,10240000000000") #include<iostream> #include<cstdio> #include<cstdlib…
题意:给一棵树,求节点L,L+1,...R的最近公共祖先 思路:先对树dfs一下,从根1出发,经过每条边时记录一下终点和到达这个点的时间截,令r[u]表示到达u这个节点的最早时间截,t[x]表示在时间截x时到达的节点编号,假设对于两个节点u,v,设r[u]<r[v],则在t[r[u]], t[r[u]+1], ..., t[r[v]]这个序列里面一定包含了u和v的LCA.要找出这个LCA也不难,由于这个序列里面的所有节点只有u和v的LCA这个节点的r值最小,于是可以用RMQ求出这个最小r值,然后…
LCA问题 一.概述: 在图论与计算科学中,两个节点 v 与 w 在有向无环图( directed acyclic graph , DAG )或树中的最近公共祖先(Lowest common anccestor , LCA ) 是这两个节点 v 与 w 的深度最深的祖先.我们定义,该深度最深的节点为 v 与 w 的最近公共最先,即LCA . 例如,在下图中 LCA ( A , B ) = F , LCA ( A , G ) = C , LCA ( B , D ) = C , LCA ( C ,…
一.什么是LCA? LCA:Least Common Ancestors(最近公共祖先),对于一棵有根树T的任意两个节点u,v,求出LCA(T, u, v),即离跟最远的节点x,使得x同时是u和v的祖先. 二.算法分类 求LCA的算法很多,按照是否在线可以分为在线算法和离线算法.      在线算法:用比较长的时间做预处理,但是等信息充足以后每次回答询问只需要用比较少的时间.      离线算法:先把所有的询问读入,然后一起把所有询问回答完成,不是本文所讲,Click here 三.在线算法 (…
求LCA(近期公共祖先)的算法有好多,按在线和离线分为在线算法和离线算法. 离线算法有基于搜索的Tarjan算法较优,而在线算法则是基于dp的ST算法较优. 首先说一下ST算法. 这个算法是基于RMQ(区间最大最小值编号)的,不懂的能够这里学习一些 而求LCA就是把树通过深搜得到一个序列,然后转化为求区间的最小编号. 比方说给出这样一棵树. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveTk5MDA0MTc2OQ==/font/5a6L5L2T/fo…
回顾st算法,它的一大功能是求区间最值.先将整个区间划分成若干个小的区间,求出最值,然后将小的区间合并成一个大的区间,我们这里要用到一个数组minn[i][j],划重点!如果我们要求的是区间最小值,minn[i][j]代表的是从i开始往后2^j个数,这一个小区间的最小值.那么最开始minn[i][0]就是第i个数自己,那么涉及算法的主体部分来了,当我们将这若干个minn[i][0]合并成一个大的区间时,这个大区间的范围就是前一个范围的两倍(因为倍增后两个等大的小区间合成一个大区间),即 minn…
摘要: 本文主要介绍了解决LCA(最近公共祖先问题)的两种算法,分别是离线Tarjan算法和在线算法,着重展示了在具体题目中的应用细节. 最近公共祖先是指对于一棵有根树T的两个结点u和v,它们的LCA(T,u,v)表示一个结点x,满足x是u和v的公共祖先且x深度尽可能的大(也即最近). 求最近公共祖先有两种方法:一种是离线求解算法,也就是将询问全部存起来,处理完之后一次回答所有询问:另一种方法就是在线求解算法,对于每次询问,动态地回答. 离线算法Tarjan Tarjan算法就是利用深度优先搜索…
原文链接http://www.cnblogs.com/zhouzhendong/p/7256007.html UPD(2018-5-13) : 细节修改以及使用了Latex代码,公式更加美观.改的过程中发现许多叙述上的问题,已经修改.然而得到这么多阅读量我真的是受宠若惊.于是我决定再补写一个在线$O(1)$查询的$RMQ$算法. 问题模型 对于一棵树,求两个节点的最近公共祖先(LCA). 如下图:(以下数字代表对应编号的节点) $1$ 和 $6$ 的 LCA 是 $8$ . $11$ 和 $1$…
<题目链接> 题目大意:给你一棵带有边权的树,然后进行q次查询,每次查询输出指定两个节点之间的距离. 解题分析:本题有多重解决方法,首先,可用最短路轻易求解.若只用LCA解决本题,也有三种常用的做法,具体方法如下: LCA转RMQ解法: #include <cstdio> #include <cmath> #include <vector> #include <cstring> #include <algorithm> using n…
LCA:最近公共祖先 指在有根树中,找出某两个结点u和v最近的公共祖先 如图,5,7的最近公共祖先就是3 接下来,我们来了解如何求解LCA No.1 暴力 首先想到的肯定是暴力,我们搜索,从两个节点一步一步向上爬. 待你爬到之时,你自然会感到TLE的魅力 复杂度:O(nm)(最坏) No.2 倍增法 倍增的主要思想就是,让较深的节点向上爬,爬到和较浅的节点同高度(然后它们就相爱了,不过它优的是,它不是一个一个向上爬 即:先搜一遍树,预处理出x的第(1<=2k<=max(dep))个父亲,存起来…
题目描述 Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. “2 x”,Alice询问Bob,集合T中有多少个字符串包含串S_x.(我们称串A包含串B,当且仅当B是A的子串) Bob遇到了困难,需要你的帮助. 输入 第1行,一个数n: 接下来n行,每行一个字符串表示S_i: 下一行,一个数q: 接下来q行,每行一个操作,格式见题目描述. 输出 对于每一个Al…
2018-03-10 18:04:55 在图论和计算机科学中,最近公共祖先,LCA(Lowest Common Ancestor)是指在一个树或者有向无环图中同时拥有v和w作为后代的最深的节点. 计算最近公共祖先往往是很有用的,比如在计算树中两个节点的距离的时候,可以分别计算根到各个节点的距离,然后计算根到最近公共祖先的距离,用之前的距离和减去2倍的根到最近公共祖先的距离就可以得到两个节点的距离. 计算最近公共祖先问题是一个非常经典的问题,相关的研究也进行了很多年,这类问题的求解方法也有很多种,…
HDU 2586 How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11320    Accepted Submission(s): 4119 Problem Description   There are n houses in the village and some bidirectional roads…
Network Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 847    Accepted Submission(s): 347 Problem Description The ALPC company is now working on his own network system, which is connecting all…
Housewife Wind Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 11419   Accepted: 3140 Description After their royal wedding, Jiajia and Wind hid away in XX Village, to enjoy their ordinary happy life. People in XX Village lived in beauti…
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每行包含两个正整数x.y,表示x结点和y结点之间有一条直接连接的边(数据保证可以构成树). 接下来M行每行包含两个正整数a.b,表示询问a结点和b结点的最近公共祖先. 输出格式: 输出包含M行,每行包含一个正整数,依次为每一个询问的结果. 输入输出样例 输入样例#1: 复制 5 5 4 3 1 2 4…
http://acm.hdu.edu.cn/showproblem.php?pid=3686 我要把这题记录下来. 一直wa. 自己生成数据都是AC的.现在还是wa.留坑. 我感觉我现在倒下去床上就能睡着了. 不知道是我的LCA错了,还是tarjan #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #incl…
倍增求\(LCA\) 倍增基础 从字面意思理解,倍增就是"成倍增长". 一般地,此处的增长并非线性地翻倍,而是在预处理时处理长度为\(2^n(n\in \mathbb{N}^+)\)的区间值.在这些预处理结果的基础上,我们可以进一步求出任意长度区间的答案. 比如区间最值问题\((RMQ)\)就可以使用倍增解决.对于每个起始点,预处理长度为\(2^n\)的区间最值.之后每段区间都可以以此求出,如: \(f(1,7)=\max(f(1,4),f(3,7))\) 以上是最简单的一个举例.在计…
题面 传送门 题目大意:给定初始根节点为1的树,有3种操作 1.把根节点更换为r 2.将包含u,v的节点的最小子树(即lca(u,v)的子树)所有节点的值+x 3.查询v及其子树的值之和 分析 看到批量修改子树,我们想到将树上操作转化为区间操作 通过DFS序我们可以实现这一点. 对于每个节点x,我们记录它在前序遍历中的位置l[x],再一次回到x时的序号r[x],则x及其子树的区间为前序遍历中的[l[x],r[x]] 具体可点击这篇博客 那么,3种操作如何进行: 操作1.用一个变量root记录当前…
水一发题解. 我只是想存一下树剖LCA的代码...... 以洛谷上的这个模板为例:P3379 [模板]最近公共祖先(LCA) 1.朴素LCA 就像做模拟题一样,先dfs找到基本信息:每个节点的父亲.深度. 把深的节点先往上跳. 深度相同了之后,一起往上跳. 最后跳到一起了就是LCA了. 预处理:O(n) 每次查询:O(n) 2.倍增LCA 朴素LCA的一种优化. 一点一点跳,显然太慢了. 如果要跳x次,可以把x转换为二进制. 每一位都是1或0,也就是跳或者不跳. 在第i位,如果跳,就向上跳2(i…
LCA模板题https://www.luogu.com.cn/problem/P3379题意理解 对于有根树T的两个结点u.v,最近公共祖先LCA(u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能小.另一种理解方式是把T理解为一个无向无环图,而LCA(u,v)即u到v的最短路上深度最小的点.例如,对于下面的树,结点4和结点6的最近公共祖先LCA(T,4,6)为结点2. 那么这里提供四种思路. 1.暴力至上主义 首先计算出结点u和v的深度d1和d2.如果d1>d2,将u结点向上移动d1…
  2020/4/30   15:55 树链剖分是一种十分实用的树的方法,用来处理LCA等祖先问题,以及对一棵树上的节点进行批量修改.权值和查询等有奇效. So, what is 树链剖分? 可以简单的理解为,将一棵树分成许多条不相交的链,每次我们只要得知链首,便可对该条链上所有的点用数据结构(like 线段树)进行相关操作 . 首先,介绍最常用的轻重链剖分. 明确最常用的轻重链概念: 重儿子:父亲节点的所有儿子中子树结点数目最多(size最大)的结点: 轻儿子:父亲节点中除了重儿子以外的儿子:…