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

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变量的值就行了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值