您的位置:首页 > 产品设计 > UI/UE

HDU 4836 The Query on the Tree (欧拉序列,线段树,动态树)

2014-08-05 15:59 489 查看


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变为根。

  现在度度熊想请更聪明的你帮助解决这个问题。

 

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行为描述中的三种操作。

 

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变量的值就行了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: