如何使用分段树和扫描线



给定300000个分段。考虑任意一对分段:a = [l1,r1]b = [l2,r2]。如果l2 >= l1r2 <= r1是"好"对。如果是a == b,则为"坏"对。超重,这是一对"坏"。

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

根据其l-值按递增顺序对分段进行排序,对于具有相同l-值的对,则根据其r-值按递减顺序对其进行排序。

假设对于一个特定的,你想计算好对(ai,aj)的数量,使得j<i.设ai=[l1,r1]并且aj=[l2,r2]。那么我们有l2<=现在我们需要对j的所有可能值进行计数,使得r2<=这可以通过为所有j的r的值维护分段树来实现,使得0<j<i.在查询第i对之后,用第i个分段的r值更新分段树。

到了分段树部分,在r的值上建立一个分段树。在更新分段树中的r值时,将分段树中r的值加1,对于查询r的特定值,查询范围[0,r-1]中的sum。这将给出与给定分段匹配良好的分段总数。

如果r的值很大,不适合分段树,则首先对值应用坐标压缩,然后对压缩的值使用分段树。

相关内容

  • 没有找到相关文章

最新更新