【发布时间】:2015-12-12 14:00:00
【问题描述】:
给定 300000 段。
考虑任何一对段:a = [l1,r1] 和 b = [l2,r2]。
如果 l2 >= l1 和 r2 <= r1 是“好”对。
如果a == b,则为“坏”对。
总的来说,这是“坏”的一对。
如何使用段树和扫描线查找给定段中所有“好”对的数量?
【问题讨论】:
标签: segment-tree scanline
给定 300000 段。
考虑任何一对段:a = [l1,r1] 和 b = [l2,r2]。
如果 l2 >= l1 和 r2 <= r1 是“好”对。
如果a == b,则为“坏”对。
总的来说,这是“坏”的一对。
如何使用段树和扫描线查找给定段中所有“好”对的数量?
【问题讨论】:
标签: segment-tree scanline
按照 l 值的升序对段进行排序,对于具有相同 l 值的对,按照 r 值的降序对它们进行排序。
假设对于一个特定的,你想计算好的对 (ai,aj) 的数量,使得 j
来到分段树部分,在 r 的值上构建分段树。在更新段树中的 r 值时,将 1 加到段树中的 r 值上,并且要查询 r 的特定值,请查询 [0,r-1] 范围内的总和。这将给出适合给定细分的细分总数。
如果 r 的值很大,不适合线段树,则先对值应用坐标压缩,然后对压缩值使用线段树。
【讨论】: