欢迎光临散文网 会员登陆 & 注册

【编程笔记】区间合并

2023-01-28 18:16 作者:夕弦-Yamai_Yuzuru  | 我要投稿

给定 n 个区间 [l,r],要求合并所有有交集的区间。

注意如果在端点处相交,也算有交集。

输出合并完成后的区间个数。

例如:[1,3] 和 [2,6] 可以合并为一个区间 [1,6]

输入格式

第一行包含整数 n

接下来 n 行,每行包含两个整数 l 和 r

输出格式

共一行,包含一个整数,表示合并区间完成后的区间个数。

区间合并思路

首先,按区间左端点进行排序。

其次,依次判断是否存在交集。

对于判断交集而言,在排序之后,区间的关系有三种可能。

1.区间A包含了区间B。

2.区间A与区间B有交集。

3.区间A与区间B没有关系。

1.2.条件符合区间合并的要求,从中也可以得出比较的条件,即出区间A的右端点>=区间A的左端点(=是因为端点处相交,也算有交集)。

由于只需统计合并完成后的区间数量,因此需要先记录区间总数,每当合并的时候减一。

而为了提高效率,在判断完需要合并区间之后,直接更新接下要比较的区间,使之成为之前需要合并的区间。

比如,有区间A,B,C(左端点有序)。区间A和B判断完需要合并后,直接更新B,使B区间为原来A和B的合并区间,再将新的B区间和C比较。

这样一来,就可以快速统计需要合并区间的数量了。

区间合并N-s图

sort 排序的是一给左闭右开的区间。 (即取得到最左边元素,但取不到最右边元素

而对于sort(a+1, a+1+n)而言,覆盖的范围是a[1] - a[n]。

此外,a的效果等同于a[0],所以a + 1就是a[1],a + 1 + n就是a[n + 1],因为sort左闭右开的特性,所以不取a[n + 1],只取到a[n]。

至于这里的pair就是将两个变量关联在一起,可以认为是结构体,不过只有两个变量,而且pair排序的时候,优先第一位,这样可以快速实现区间左端点进行排序。

开心,这比离散化简单多了。


【编程笔记】区间合并的评论 (共 条)

分享到微博请遵守国家法律