区间合并
基本思路
区间合并,就是把有交集的两个集合进行合并,合并成更大的区间,即取两个区间的并集。其实会判断是否有交集自己就会了。
算法步骤:
用
pair
存左右区间,最好养成习惯左闭右闭,即第i
个区间: $[l_i, r_i]$对每个区间进行排序
sort
对pair
排序时,优先以左端点排序,再以右端点排序。默认就是假设我们从前往后扫描到了第
i
个区间,那么第i
个区间和当前维护的区间的关系有三种:假设当前维护区间:$[l, r]$
第
i
个区间:$[l_i, r_i]$因为已经排过序了,所以 $l_i < l$
第
i
个区间在当前维护的区间的内部即: $l_i < r \ r_i < r$
第
i
个区间和当前维护的区间有交集,但不完全在维护的区间的内部即:$l_i < r \ r_i > r$
第
i
个区间和当前维护的区间没有交集即:$l_i > r$
例题
题目
给定 n 个区间 $[l_i,r_i]$,要求合并所有有交集的区间。
注意如果在端点处相交,也算有交集。
输出合并完成后的区间个数。
例如:[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含两个整数 l 和 r。
输出格式
共一行,包含一个整数,表示合并区间完成后的区间个数。
数据范围
1≤n≤100000,
−109≤li≤ri≤109
输入样例:
5
1 2
2 4
5 6
7 8
7 9
输出样例:
3
代码
1 |
|
这里不需要讨论情况1,情况1对结果没有贡献。
遇到情况3代表遇到了一个新的区间。遇到了情况2代表合并(右边界更新)。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 秋白's Blog!
评论