Description
豪哥生活在一个n个点的树形城市里面,每一天都要走来走去。虽然走的是比较的多,但是豪哥在这个城市里面的朋友并不是很多。
当某一天,猴哥给他展现了一下大佬风范之后,豪哥决定要获得一些交往机会来提升交往能力。豪哥现在已经物色上了一条友,打算和它(豪哥并不让吃瓜群众知道性别)交往。豪哥现在spy了一下这个人的所有行程起点和终点,豪哥打算从终点开始走到起点与其相遇。但是豪哥是想找话题的,他想知道以前有多少次行程和此次行程是有交集的,这样豪哥就可以搭上话了。这个路径与之前路径的有交集数量作为豪哥此次的交往机会。
但是豪哥急着要做交往准备,所以算什么交往机会的小事情就交给你了。
Solution
这题其实很妙,两条路径有交有两种情况,lca在当前路径上,lca在根到当前lca路径上。第一种情况建一个树状数组,加入路径时lca dfn打+1,leave+1打-1,贡献为1~u+1~v-2*1~lca。第二种情况另建一个树状树状数组,加入路径u,v打+1,lca打-2,贡献为lca dfn~leave。
code
#include<set>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<alg