题目

神犇题解

这题挺神的。。思路很巧妙

首先想到DFS序(毕竟是子树问题),这道题可以转化成:我们对于每一个节点的子树区间去看,两棵树同一节点的这个子树区间有多少个相同元素,设个数为x,那么这个点的贡献为x*(x-1)/2。

现在的问题就是怎么快速求解区间相同元素了。这也是我没想好的地方。我们用每一个点的第一棵树dfs序作为每一个点的权值,用第二个点的dfs序区间建主席树,那么要查询这个个数,就等于在相应的主席树上查找[l,r]区间内的元素有多少个,这样就能解决问题了。

还有一个常数较小,代码量较小的方法,树状数组。(说起来之前有道题也是可以主席树也可以树状数组的)。

在遍历子树之前,我们先算一遍答案为x,添加完子树之后再算一次,这个结果去掉x就是正确答案了。