【发布时间】:2014-03-03 14:52:37
【问题描述】:
考虑如下定义的无限二叉树。
对于标记为 v 的节点,让它的左孩子表示为 2*v,右孩子表示为 2*v+1。树的根标记为 1。
对于给定的 n 个范围 [a_1, b_1], [a_2, b_2], ... [a_n, b_n] 其中 (a_i
对于某个整数 T,令 S 表示所有 i 到 n 的并集 [a_i, b_i]。 我需要找到 S 中元素 x,y 的唯一对(不考虑顺序)的数量,使得 lca(x,y) = T
(维基百科对两个节点的LCA 有一个很好的解释。)
例如,对于输入:
A = {2, 12, 11}
B = {3, 13, 12}
T = 1
输出应该是 6。(范围是 [2,3]、[12,13] 和 [11,12],它们的并集是集合 {2,3,11,12,13}。在所有 20 个可能的对中,恰好有 6 个((2,3)、(2,13)、(3,11)、(3,12)、(11,13) 和 (12,13))具有LCA 为 1。)
对于输入:
A = {1,7}
B = {2,15}
T = 3
输出应该是6。(给定的范围是[1,2]和[7,15],它们的并集是{1,2,7,8,9,10,11,12,13 ,14,15}. 在 110 个可能的对中,正好有 6 个 ((7,12), (7,13), (12,14), (12, 15), (13,14) 和 (13, 15)) 的 LCA 为 3。)
【问题讨论】:
-
二叉树是它的根节点
class Node { Node parent, first, second; }。您正在使用一些奇怪的符号,似乎是指您存储节点元素的数组索引,但树通常不会以这种方式存储在数组中。 -
您能否提供一个链接来准确描述“LCA”的含义,或者描述您对“树”的表示法?
-
数字不是树节点。
-
我会尽力而为,在解决这个有趣的问题时请耐心等待。
-
看到这里被问到这个问题真的很难过。这是我为在线测试设置的问题。测试刚刚结束,所以在测试期间就问了这个问题。我想将此添加为评论,但没有足够的声誉来做到这一点,因此将其作为答案。
标签: algorithm binary-search-tree