这题难的不是树状数组(其实树状数组很简单),主要是映射到树状数组。对树和图还不熟啊,导致这题就是借了别人的思路,可以用邻接表建树,
然后dfs一次就可以算出对某个节点它的第一个下标(在树状数组中)和最后一个下标。
那个更改的时候就用这两个下标就行了。
比如下面的样例
1 2
2 5
1 3
2 4
那么dfs一次之后,就会得到如下坐标(1,5)(3,5)(2,2)(5,5)(4,4)(建图不一样的话,后面对应出来的坐标会不一样,每一对表示样例中的数的第一个
下标和最后一个下标),也就是说从1开始,那么第一个就是1,最后一个是5(这个5不是节点5,而是节点4,但是第5个被访问,其实第几个访问没关系的,
我们只是要一个区间而已,这个区间代表包含了这棵树(或者子树)),那么和它有关的就是[1,5],对于2这个点它在树中是第3个访问的(2个是节点3)
那么2的第一个下标就是3,在这个子树中最后一个访问的还是5,所以和它有关的区间就是[3,5].同理可以得到其他几个点所对应的坐标,不过中间可能不
怎么好想,我是这么理解的,对每一个点找出影响它的所有点然后放在一个区间中,那么改变时就好办了,而放在一个区间中,就可以用dfs了。
代码如下(如果对图理解的好的话,建议自己先写)
CODE