我的考试有一个问题,我必须提出一个有效的算法。问题是这样的:
我们有一些具有两个属性的对象:
H = <1,1000000>
R = <1,1000000>
如果H1>H2
和R1>R2
,我们可以将一个对象插入另一个对象。输入包含H
和R
对,每行一对。如果当前对象可以插入到任何先前的对象中,我们选择具有最小H
的对象,然后我们销毁它们。打印输出中的左对象数。
我想知道如何使用二叉搜索树或分段树或使用fenwick树在O(n.log(n))
时间复杂度中解决此问题。
提前致谢。
答案 0 :(得分:1)
使用fenwick树的解决方案,如下所示;
R
对整个数组进行排序(现在,我们并不关心H
),并为每个项目分配一个标记(等于它#39) ; s在排序数组中的位置)。H
存储最大值(从开始到该位置)。R
排序顺序排列。H
运行二进制搜索(上限)。并且,由于项目已按R
顺序排序,而不是整棵树,我们需要在有效范围内进行搜索。O(log(n))
中完成。查看查找具有给定累积频率的索引部分this文章。