树上的一个题目

题目:给出一棵树,每棵树的节点有权值,现在有m组询问,在线询问以节点x为根,高度为y的所有子节点的最大权值。

这题是我今早在做HDU 4601时,由于思路错了,稍微改动了一下题目,得到这个简单版,不知道有没有出现过原题。

 

分析:

  由于必须在线,离线的做法不可取。

  询问的是以节点x为根的子树的节点信息,因此考虑一下dfs序。在dfs时,我们用数组d[i]记录第i层的节点。那么,在一棵子树下相同高度的节点必然连续出现在数组d[i]中。对于n个节点按d[i]重新编号,并且把值也在新编号的位子上,记录相应的hash值(hash[新编号] = 旧编号)。

  构造线段树,维护一下新的编号。

  这时,以节点x为根的第i层子节点必然连续在线段树上。因此对于询问x,dep,我们首先按照dfs序计算出x的第dep层在d[x+dep-1]数组的区间,可以根据dfs序二分取出区间的最左以及最右的节点,根据hash值得到在线段树的区间,询问区间最大值即可。

  

  不知道以上思路是否正确?

posted @ 2013-09-13 13:52  yejinru  阅读(192)  评论(2编辑  收藏  举报