CF 1076E Vasya and a Tree(dfs+树状数组)待解决

链接:http://codeforces.com/problemset/problem/1076/E

题意:给你一颗以1为根节点的树,初始所有节点的权值为0,然后有m个操作,每个操作将点v的儿子节点中和本身的所有距离不超过d的节点权值加x,问经过m次操作后,输出每个节点的权值。

题解:如果是一个序列,就可以直接用树状数组做,但这是一颗树,所以我们可以想办法把它转化成序列。我们可以先求出每个节点的dfs序,以及深度和子树的大小,顺便记录每个深度都有哪些节点,子树的大小用来确认以该节点为根的子树在dfs序中的范围,此时便可用树状数组维护了。之后,我们把每个操作按能影响到的深度从大到小排序,即优先处理影响深度大的操作。设当前计算的深度为now,假设所有操的作影响的深度大于now的操作已经计算。如果当前操作影响的深度小于now,说明所有能影响到now深度的操作已经全部操作完了,此时把所有深度为now的节点权值计算出来。每读取一个操作的信息,就把操作产生的影响用树状数组维护,因为影响now深度的节点权值已经计算完毕了,所以我把以该操作的操作节点为根的子树全部加上操作的值 对之前已经计算的答案没有影响。操作全部完成后,深度从深到浅计算答案即可。

猜你喜欢

转载自www.cnblogs.com/Yokel062/p/11720881.html
今日推荐