The Query on the Tree
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 197 Accepted Submission(s): 91
Problem Description
度度熊最近沉迷在和树有关的游戏了,他一直认为树是最神奇的数据结构。一天他遇到这样一个问题:
有一棵树,树的每个点有点权,每次有三种操作:
1. Query x 表示查询以x为根的子树的权值和。
2. Change x y 表示把x点的权值改为y(0<=y<=100)。
3. Root x 表示把x变为根。
现在度度熊想请更聪明的你帮助解决这个问题。
有一棵树,树的每个点有点权,每次有三种操作:
1. Query x 表示查询以x为根的子树的权值和。
2. Change x y 表示把x点的权值改为y(0<=y<=100)。
3. Root x 表示把x变为根。
现在度度熊想请更聪明的你帮助解决这个问题。
Input
第一行为数据组数T(1 <= T <= 100)
每组数据第一行为N(1<= N <= 10000),表示树的节点数。
后面N-1行每行有两个数x,y ,表示x,y之间有一条边 1<=x,y<=N。初始时树是以1号节点为根节点。
之后的一行为N个数表示这N个点的点权(点权的范围是0到100)。
然后为整数Q(Q<=1000)为操作次数。
之后的Q行为描述中的三种操作。
每组数据第一行为N(1<= N <= 10000),表示树的节点数。
后面N-1行每行有两个数x,y ,表示x,y之间有一条边 1<=x,y<=N。初始时树是以1号节点为根节点。
之后的一行为N个数表示这N个点的点权(点权的范围是0到100)。
然后为整数Q(Q<=1000)为操作次数。
之后的Q行为描述中的三种操作。
Output
对于第k组输入数据,第一行输出Case #k 接下来对于每个”Query x”操作,输出以x为根的子数和。
Sample Input
2 5 1 2 1 3 3 4 3 5 1 2 3 4 5 5 Query 1 Change 3 10 Query 1 Root 4 Query 3 8 1 2 1 3 3 4 4 5 5 6 5 7 4 8 1 2 3 4 5 6 7 8 5 Query 1 Query 3 Root 5 Query 3 Query 1
Sample Output
Case #1: 15 22 18 Case #2: 36 33 6 3
题解:
除了有root操作与poj上的3321一样,这里解释下如何对root进行操作。
增加个变量root,也就是当前哪个节点是根节点,由dfs可以得到欧拉序列,通过欧拉序列我们可以知道当前的root是否是在我们所查询的节点u的子节点。
如果其是它的子节点,那么我们遍历下查询节点的儿子节点,看看根节点是在哪个儿子节点的子树上,假如实在儿子节点v上,那么就查询结果就是,u的区间和减去v的区间和。
如果u是根节点,那么之间算整个区间和就行了。
如果不是它的子节点,u也不是根节点,那么就直接计算u的区间和,它就是结果了。
区间修改同poj 3321,root操作,直接改变root变量的值就行了。