LCA/RMQ
文章平均质量分 77
ccDLlyy
不忘初心,方得始终
展开
-
三种LCA算法(三):转化为LCA问题(dfs+ST表实现)
转化为RMQ问题也是比较常用的LCA算法之一,大多采用dfs+ST表实现,在线算法,复杂度为O(n + nlogn + Q),Q为查询次数。在线算法里,dfs+ST表算法比Doubly算法快。算法流程:1.对树进行dfs,将遍历到的节点按照顺序记下,将得到一个长度为2*n - 1的序列。2.每个节点都在序列中出现,我们记录节点u第一次在序列中出现的位置为first[u]。3.根据d原创 2017-08-25 14:10:06 · 950 阅读 · 0 评论 -
三种LCA算法(二):Tarjan算法
Tarjan算法也是一种常用的解决LCA问题的算法,算法复杂度低,O(n + Q),Q为查询次数,基于DFS+并查集,离线算法(首先读入所有的询问(求一次LCA叫做一次询问),然后在算法执行过程中完成所有查询,把查询结果存储起来,再去根据每次查询直接输出结果),离线算法局限性较大。算法思路:Tarjan算法也是基于DFS的,对于新搜索到的一个节点,首先创建由这个节点构成的集合,再对当前节点原创 2017-08-24 15:13:40 · 892 阅读 · 0 评论 -
三种LCA算法(一):Doubly算法(倍增算法)
LCA,最近公共祖先,实现有多种不同的方法,对于树上的问题有着广泛的应用,比如树上的最短路径。常用的解决LCA问题的算法有:Tarjan算法,Doubly/倍增算法,转化为RMQ问题等。本文介绍基于DFS+二分搜索的在线算法,Doubly/倍增算法。(此处二分不同于二分查找算法那种)算法初探:对于已知的一棵树(已编号),若记录点v到根的深度为depth[v]。那么,如果节点w是u和原创 2017-08-23 21:55:16 · 1451 阅读 · 0 评论 -
RMQ算法(一):ST表(Sparse Table)
#include #include #include #include #include #include using namespace std;int n;int a[100005], dp[10005][20], upper[100005];//以最小值为例;upp原创 2017-08-22 22:43:35 · 552 阅读 · 0 评论 -
POJ 3264 Balanced Lineup(ST表)
题目链接:点击打开链接裸的ST表,水题// POJ 3264 Balanced Lineup.cpp 运行/限制:3375ms/5000ms#include #include #include #include using namespace std;int n;int a[50005], minValue[50005][20], maxValue[50005][20], u原创 2017-08-22 21:29:19 · 349 阅读 · 0 评论 -
2017百度之星初赛(B) 1002 Factory(倍增法求LCA)
题目链接:点击打开链接思路:树形图上的最短距离,很容易想到LCA算法,树形图上的两个节点的最短距离是唯一的、确定的,是两个节点到其最近公共祖先的距离之和。直接枚举两个分公司的办公室,两两算出最短路径,取最小值即为结果。具体利用LCA求出最短距离的方法是,先预处理,深搜一遍树形图,得到每个节点距离树根的距离,则最短距离为dist[x] + dist[y] - 2 * dist[ lca(原创 2017-08-15 20:46:01 · 461 阅读 · 0 评论