题目大意为,定义合法的根:根到任意结点的路径上的点权唯一,求合法的根的数量。
我们很容易想到,合法的根的数量 = 总点数 - 非法根的数量。
对于任意点权相同的结点,只有它们之间的路径上的结点以及结点的子树才有可能合法,除此之外一定不合法。
对于任意结点的一颗子树,我们容易得到以下结论:
1.若子树内存在点权与结点值相同的点,则子树外的所有结点都是非法点。
2.若子树外存在点权与结点值相同的点,则子树内的所有结点都是非法点。
我们通过每个点的 D F S DFS DFS 序,可以很容易的维护结点和子树的关系,因为一个结点和它的子树对应的 D F S DFS DFS 序是一个连续的序列(树链剖分用线段树维护子树也是这个道理)。
通过 D F S DFS DFS 序,我们可以用差分数组(或者其他数据结构,这题 3 s 3s 3s,套个 l o g log log 级的也没问题)来快速维护区间(也就是子树)。将区间内所有不合法的点的差分数组值