首页 > 代码库 > hdu6110(线段树+lca)
hdu6110(线段树+lca)
题目
http://acm.hdu.edu.cn/showproblem.php?pid=6110
分析
注意到,若干条路径的交一定也是条路径
我们可以维护一个线段树,seg[l..r]存着第l条~第r条路径的交(用起点和终点表示即可)
维护的时候就是两个孩子对应的路径求个交作为自己的交
询问的时候也是讲询问分成若干段,然后逐个合并
于是我们只要解决两条路径求交的问题就可以了
设两个lca分别是c1,c2,dep[c1]<=dep[c2]
设a1与a2的lca为d1,设a1与b2的lca为d2,设b1与a2的lca为d3,设b1与b2的lca为d4
并设dep[d1]<=dep[d2]<=dep[d3]<=dep[d4]
画图可以发现,存在路径交的充要条件是dep[d4]>=dep[d3]>=dep[c2]
路径交就是d4->d3这一段
时间复杂度是O(nlog^2n)
如果求lca用rmq来求的话就是O(nlogn)了
rmq求lca就是求dfs序数列,u,v两点的lca就是dfs序数列中dfstime[u]..dfstime[v]中深度最小的那个位置
这样查询是O(1)的
hdu6110(线段树+lca)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。