在做树上问题时,我们经常会遇到$LCA$(最近公共祖先)问题。曾经的我遇到这类问题只会$O(n)$暴力求解,学了倍增$LCA$,就可以$O(logn)$解决了。
转载 2018-10-29 15:46:00
101阅读
2评论
这是一个在线算法——这是非常重要的一点,求一次的复杂度是logn 总复杂度为mlogn 个人过的,介绍几题1036 商务旅行 codevs 另外一题难度差不多,只是边上多了一个权值,这时只是dfs稍加改进即可 http://codevs.cn/problem/2370/ 也是codevs上的题,还可
转载 2017-04-27 19:13:00
95阅读
2评论
原帖在这:http://blog.csdn.net/crazy_ac/article/details/7796497LCA可以离线t
原创 2023-07-17 18:14:18
62阅读
const int POW = 18; void dfs(int u,int fa){ d[u]=d[fa]+1; p[u][0]=fa; for(int i=1;i d[b] ) a ^= b, b ^= a, a ^= b; if( d[a] = 0; i-- ) if( p[a][i] != p[b][i] ) a = p[a][i] , b = p[b][i]; a...
原创 2021-08-03 09:19:53
143阅读
题目链接:https://www.luogu.org/problemnew/show/P3379 AC代码:
转载 2018-12-01 17:11:00
112阅读
2评论
  1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 const int maxn=1e5+10; 5 int n,m,s,num=0,head[maxn],dep[maxn],f[maxn][23]; 6 int a1,a2; 7 struct edg{ 8 int
转载 2020-03-13 12:02:00
94阅读
2评论
LCA就是最近公共祖先,比如 节点10和11的LCA就是8,9和3的LCA就是3。 我们这里讲一下用树上倍增来求LCA。 大家都可以写出暴力解法,两个节点依次一步一步往上爬,直到爬到了相同的一个节点。 二树上倍增就是对暴力的优化,改成了一次爬好几步。 具体怎么爬呢?就是两个点每次爬 2^j 步,而
原创 2021-05-29 18:32:33
272阅读
题目描述 对于 n(<100000)个点 n-1 条掉权值的边,有 m 个询问,每条询问求两个结点之间的路径上边权的最小值 对于 n(<100000)个点 n-1 条掉权值的边,有 m 个询问,每条询问求两个结点之间的路径上边权的最小值 输入 第一行 n,表示结点个数,接下来 n-1 行,每行 a
转载 2017-06-15 21:41:00
84阅读
2评论
树上问题中,有个相当著名而又较为困难的问题,即最近公共祖先问题(Least Common Ancestors),又简称LCA问题。我们先了解一下何为LCA吧。 LCA,即已知一棵有根树,求问两个节点的最近的公共祖先是哪个节点。 从最朴素的算法去思考,我们只要找到这两个节点的深度,先从最深的节点向上搜 ...
转载 2021-07-17 17:50:00
198阅读
2评论
裸题,如此之水…Code:#include#includeusing namespace std;const int maxn = 100000 + 4;const int logn = 25;int f[logn][maxn], head[maxn dep...
原创 2021-07-05 13:40:06
174阅读
找i节点的第k个父亲 int father(int i,int k) { for(int x=0;x<=int(log2(k));x++) if((1<<x)&k) //(1<<x)&k可以判断k的二进制表示中,第(x-1)位上是否为1 i=fa[i][x]; //把i往上提 return i; } ...
转载 2021-07-22 17:03:00
112阅读
2评论
这几天,提高B组总是有求LCA的题。由于我是蒟蒻,所...
转载 2017-08-20 21:17:00
63阅读
2评论
LCA,即树上两点之间的公共祖先,求这样一个公共祖先有很多种方法:暴力向上:O(n)每次将深度大的点往上移动,直至二者相遇树剖:O(logn)在O(2n)预处理重链之后,每次就将深度大的沿重链向上,直至二者在一条链上tarjan_lca:离线O(n+m)先记录所有的询问,对树进行一次dfs,对于搜索...
原创 2021-07-20 14:48:40
655阅读
倍增lca模板 https://www.luogu.org/problem/show?pid=3379
原创 2021-08-05 10:19:34
78阅读
对于每个节点v,记录anc[v][k],表示从它向上走2k步后到达的节点(如果越过了根节点,那么anc[v][k]就是根节点)。 dfs函数对树进行的dfs,先求出anc[v][0],再利用anc[v][k] = anc[anc[v][k - 1]][k - 1] (从v向上2k步即为从v向上2(k
转载 2019-04-18 19:54:00
136阅读
2评论
. 1 #include <cstring> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <algorithm> 5 #include <cmath> 6 #include <vector> 7 using namespace std; 8
转载 2019-11-19 22:13:00
173阅读
2评论
洛谷P3379题目描述输入格式输出格式输入输出题目链接题目描述如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖
原创 2021-03-07 22:11:25
54阅读
一、前人种树 博客:最近公共祖先 LCA 倍增法 博客:浅谈倍增法求LCA 二、沙场练兵 题目:POJ 1330 Nearest Common Ancestors 代码:
转载 2017-07-26 00:51:00
139阅读
2评论
You are given a tree (an undirected acyclic connected graph) with N nodes, and edges numbered 1, 2, 3...N-1. Each edge has an integer
原创 2023-04-25 00:08:28
53阅读
本题并不需要并查集,每次查询一次最近公共祖先,并倍增求出需要被新标记的路径。
原创 2021-07-07 15:40:49
141阅读
  • 1
  • 2
  • 3
  • 4
  • 5