我试图解决这个涉及查询fenwick树的问题。 问题陈述如下:
这是Hackerrank比赛的一个问题:link
您将获得一棵树,其中每个节点都标记为1,2,...,n。这棵树中有多少个相似的对(S)?
一对(A,B)是类似的对iff
输入格式: 输入的第一行包含两个整数n和T.接着是n-1行,每行包含两个整数si和ei,其中节点si是节点ei的父节点。
输出格式: 输出一个整数,表示树中相似对的数量
约束:
1 <= n <= 100000
0 <= T <= n
1 <= si, ei <= n.
也保证没有循环,但树不必是二叉树。
示例输入:
5 2
3 2
3 1
1 4
1 5
示例输出:
4
说明: 类似的对是:(3,2)(3,1)(3,4)(3,5)
我的算法: 我将遍历DFS中的树,同时维护HashSet S以进行查询。在进入节点时,我将节点x添加到S,同时让我将其从集合中删除。
现在为了在特定叶节点找到答案,我需要找出Set中跟随x-T&lt; = y&lt; = x + T的节点数,其中&#39; y&#39;是祖先,x-T和x + T是范围内的节点。
我理解Fenwick Tree的概念,但是我无法设计在树中存储的内容以便进行远程查询,或者特别是如何进行远程查询。我理解它在检索总和时是如何工作的,但给定一个范围[左,右]如何找到树中存储的范围中的元素数
答案 0 :(得分:1)
我找到了在princeton算法中查询fenwick树的例子。你可以在这里找到它:
http://algs4.cs.princeton.edu/99misc/FenwickTree.java.html
希望它能帮助你完成背景。
答案 1 :(得分:1)
请注意,标签范围最多为10^5
,因此您可以将标签存储在Fenwick树中。使用1表示节点的存在,否则为0.然后sum表示节点的总数。
假设我们有Fenwick树T
,方法
add(pos, val)
,添加 val
到位pos
,O(lgn)sum(pos)
,获取位置1到pos
的总和,O(lgn) dfs在插入节点x
时执行T.add(x, 1)
,删除节点x
时,执行T.add(x, -1)
,何时对节点x
进行查询,它是T.sum(x+k) - T.sum(x-k-1)
。
有关详细信息,请参阅code。