51nod 1681
Posted Izaya
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod 1681相关的知识,希望对你有一定的参考价值。
这题挺神的。。思路很巧妙
首先想到DFS序(毕竟是子树问题),这道题可以转化成:我们对于每一个节点的子树区间去看,两棵树同一节点的这个子树区间有多少个相同元素,设个数为x,那么这个点的贡献为x*(x-1)/2。
现在的问题就是怎么快速求解区间相同元素了。这也是我没想好的地方。我们用每一个点的第一棵树dfs序作为每一个点的权值,用第二个点的dfs序区间建主席树,那么要查询这个个数,就等于在相应的主席树上查找[l,r]区间内的元素有多少个,这样就能解决问题了。
还有一个常数较小,代码量较小的方法,树状数组。(说起来之前有道题也是可以主席树也可以树状数组的)。
在遍历子树之前,我们先算一遍答案为x,添加完子树之后再算一次,这个结果去掉x就是正确答案了。
以上是关于51nod 1681的主要内容,如果未能解决你的问题,请参考以下文章