【发布时间】:2016-08-12 03:51:26
【问题描述】:
我正在尝试解决这个涉及查询 fenwick 树的问题。 问题陈述如下:
这是一个来自 Hackerrank 竞赛的问题:link
给你一棵树,其中每个节点都标记为 1、2、...、n。这棵树中有多少相似对?
A pair (A,B) is a similar pair iff
- 节点 A 是节点 B 的祖先
- abs(A - B)
输入格式: 输入的第一行包含两个整数 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
我了解 Fenwick 树的概念,但我无法设计在树中存储什么以进行范围查询,或者特别是如何进行范围查询。我了解它在检索总和时的工作原理,但是给定一个范围 [left, right] 我如何找到存储在树中的范围内的元素数量
【问题讨论】: