题意:

给你一棵树,问你树上有多少条路径其长度为3的倍数,输出一个整数.注意路径有方向性且自身到自身也算一条路径.

解法一:树形dp

首先对于这种统计树上路径的题,我们要认清两个事实,

一.我们对树上的路径做一个划分 :分为两种,一种是不拐弯的直链,一种是弯链(只折一下)。我们将其深度最小的点作为他们的根节点.

那么对于每个节点x,我们要统计两个东西,一个是以x的为根节点的直链,一个是以x为根节点的弯链。

对于前者,dp转移显然,

对于弯链来讲,他可以看成两条直链拼接成的。

还是用动态规划的思想,考虑每次新增一颗子树k时,他对节点x的弯链的贡献:

在统计直链的时候还需要注意一个问题:,有两种方法。

第一种是额外统计:每次dfs结束前统计直链①ans += dp[node][0](将符合条件的直链统计进去)②dp[node][0]++(可以看做拉出一条长度为0的虚点,目的是将 与父节点直接相连的这条路径 统计进去)

更妙一点的方法:我们可以对每个点出来一个自己到自己的长度为0的虚点,即在dfs开头加上dp[node][0] = 1.这样我们就可以将统计直链和统计弯链 统一 起来。(这样的话相当于将一条直链看成是 自己到自己的一条链 与 其他链拼接起来,这样就完成了统一)


又因为有序,所以答案乘2,又可以自己到自己,加上n

解法二:裸点分治