如何使用分段树和扫描线

时间:2015-12-12 14:00:00

标签: segment-tree scanline

鉴于300000个细分市场。 考虑任何一对细分:a = [l1,r1]b = [l2,r2]。 如果l2 >= l1r2 <= r1,则为“好”对。 如果a == b,那就是“坏”对。 过度,这是“坏”对。

如何使用分段树和扫描线找到给定段中所有“好”对的数量?

1 个答案:

答案 0 :(得分:0)

对于它们的l值,按照递增顺序对片段进行排序,对于具有相同l值的对,按照它们的r值按递减顺序对它们进行排序。

假设某个特定的,您想要计算好的对(ai,aj)的数量,使得j <1。一世。设ai = [l1,r1]和aj = [l2,r2]。然后我们得到l2 <= l1。现在我们需要计算j的所有可能值,使得r2 <= r1。这可以通过为所有j维持r的值的分段树来完成,使得0 <0。 j&lt;一世。查询第i对后,使用第i个段的r值更新段树。

来分割树部分,在r的值上构建一个分段树。在更新段树中r的值时,在段树中将r加1,并查询r的特定值,查询[0,r-1]范围内的和。这将给出与给定段一致的段的总数。

如果r的值很大而不适合分段树,则先将坐标压缩应用于值,然后使用分段树作为压缩值。