bzoj 1906: 树上的蚂蚁

来源:互联网 发布:百度人工智能识别卡 编辑:程序博客网 时间:2024/05/03 20:58

Description

Input

Output

Sample Input

1
3
1 2 1
2 3 1
3
1 3 2
3 1 1
1 2 3

Sample Output

2

HINT

N< = 100000

Source

Play with tree By Amber


摘自Mektpoy的博客
传送门→http://blog.sina.com.cn/s/blog_ab8386bc0101i146.html←传送门
1、链有重合部分
求(a,b)离c最近的点。
我们以c为例:
此时令r=LCA(a,b),假设c不在r的子树中,即LCA(c,r)!=r那么r就是我们要找的这个点
如果LCA(c,r)==r有三种情况,第一种是LCA(a,c)==LCA(b,c)==r此时依然是r
另一种是LCA(a,c)!=r 那么此时就是LCA(a,c) 还有一种 LCA(b,c)!=r 此时是LCA(b,c)
这个画个图就能理解。。
另外其实不用再分三类,因为如果LCA(a,c)!=r 那么这个点就一定是LCA(b,c)了。。
2、链没有重合部分
这里博客里写错了。应该是
lca(v, q) = lca(v, u) && lca(u, q) = q 或者 lca(u, q) = lca(v, u) && lca(v, q) = q则有重合
然后整体加个not就可以得出没有重合部分的条件了。
--------------------------------------------------------------------------------------------------------------------
然后开始写代码。n=10w m=1000 感觉m^2logn似乎可以过!于是我就写了个倍增求LCA
然后。。然后就这么T了
题目特意给了T组数据来卡掉用倍增求LCA的.
所以我们需要用欧拉序列预处理然后O(1)求LCA
那么复杂度就是O(Tm^2)了。
然后我又超时了
用ST维护的时候调用了自带的log函数..预处理了log后快了3倍。然后终于过了
--------------------------------------------------------------------------------------------------------------------
既然网上都没有这题的代码那我也就不贴了!祝调试顺利XD【其实就是自己调试太久的怨念】
0 0
原创粉丝点击