LCA
Bahuia
软件工程博士
展开
-
LCA在线算法学习笔记
LCA就是求树上两个节点的最近公共祖先。LCA的在线算法最好的就是ST算法,这是一种基于RMQ(区间最小值)的算法,总的来说,就是利用dfs搜索得到一个序列,然后在这个序列中确定一个区间内,找到最小值的编号就是对应两点的LCA。举例说明,如图所示一棵树:通过深搜可以得到这样一个序列:节点ver: 1 3 1 2 4 2 5 6 5 7(左到右)深度 R :1 2 1原创 2016-11-10 16:25:18 · 564 阅读 · 1 评论 -
LCA离线算法学习笔记
算法思想:LCA离线,采用的是递归的tarjan算法,利用了树深度优先遍历的性质可以在一次遍历过程中巧妙的求解出查询的最接近公共祖先,时间复杂度是O(n+q),但前提是需要离线保存所有询问。 算法思路如下: 当前dfs遍历到节点u,先将vis[u]标记成true,然后处理以u为根节点的子树,子树处理完成后,将这棵子树中的所有点的祖先都设成u,这时候处理跟u相关的所有询问(u,v),如果vis[v原创 2017-04-11 15:11:33 · 914 阅读 · 0 评论 -
HDU - 4912 LCA + 贪心
题意:题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4912 一棵树上有m条链,要求取得最多的链,保证链与链之间的节点没有重复。思路:又get到新套路 对于树上任意两点之间的路径,一定会经过他们之间的LCA。 贪心的思路,很关键的一点要意识到,对于两条链,如果存在重复,应该选择LCA深度较大的,也就是里根越远的。因为深度越小灵活度越小原创 2017-04-11 16:22:38 · 665 阅读 · 0 评论 -
HDU 6162 主席树+LCA(树上求区间[a,b]中的个数)
题意:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6162 给出一棵树,每个结点有一个权值,然后给出若干询问,针对询问区间(u,v,L,R),求在结点u和v的路径上,权值大小在[L,R]中的结点权值总和是多少。思路:其实思路和SPOJ COT差不多,传送门:http://blog.csdn.net/bahuia/article/details/77原创 2017-08-24 10:51:36 · 530 阅读 · 0 评论 -
SPOJ COT 主席树+LCA(树上第k大)
题意:题目链接:https://vjudge.net/problem/SPOJ-COT 对于给出的一棵树,给出若干询问,问任意两个节点的路径上第k小的节点的权值是多少?思路:主席树的另一种经典问题。 看似与HDU 2665不同,这里是针对树结构,其实思路基本不变。只是在建立主席树的时候,需要根据树的父子关系来构造,也就是节点u的线段树要在u的父亲基础上构建。 另外,在寻找第k大时,需要考虑x到原创 2017-08-23 18:43:05 · 565 阅读 · 0 评论 -
2017西安网络赛G题 分类暴力
题意:题目链接:https://nanti.jisuanke.com/t/17120 给出一棵树,每个节点的有个价值,给q个询问(u,v,k),若结点u到v的路径上的点为a0,a1,a2…am,问其中a0^ak^a2k^…apk的结果。思路:套路,按照k分类,首先求出LCA,k大于等于250时直接暴力求解,k小于250时保存从根结点到每个结点的异或和sum[u][x],x表示每次走x步。代码:#i原创 2017-09-21 19:10:10 · 461 阅读 · 0 评论