#20. 区间合并

区间合并

给定 nn 个区间 [li,ri][l_i, r_i],要求合并所有有交集的区间。

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

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

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

输入格式

第一行包含整数 nn

接下来 nn 行,每行包含两个整数 llrr

输出格式

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

数据范围

1n1000001 \le n \le 100000,
109liri109-10^9 \le l_i \le r_i \le 10^9

输入样例:

5
1 2
2 4
5 6
7 8
7 9

输出样例:

3

样例:基础正确性(既有端点相交 [1,2]+[2,4],也有部分重叠与独立段)。

n=1 单区间:卡初始化/边界(有人忘记处理最后一个区间导致 0 或空输出)。

两个完全不相交:卡把不相交也合并、或排序/判定条件写错。

端点相交必须合并 [1,2] & [2,3]:专卡把条件写成 l < curR 而不是 l <= curR。

多段“链式端点相交/重叠”:卡只合并一次、不做持续扩展(如合并后没更新右端点或没继续合并)。

嵌套区间(大区间包含小区间):卡“只要遇到新区间就计数+1”、或错误地把嵌套当作新段。

完全相同区间重复多次:卡去重/计数错误(可能输出 10 而不是 1)。

负数区间 + 部分重叠 + 独立段:卡负数比较/排序错误、或只考虑正数范围。

负数端点相交 [-5,-3] & [-3,-1]:同 #4,但在负数上再卡一次(防止有人只在正数上测试过)。

跨越 0 + 乱序输入 + 需要整体合并:区间是 (-3,1),(2,4),(1,2),应合成 (-3,4);卡没排序、或只合并相邻输入行。

乱序 + 多组混合(既要合并也要分段):卡“按输入顺序合并”、或排序后合并逻辑错误。

极值点区间 [-1e9,-1e9] 与 [1e9,1e9]:卡边界/溢出/排序稳定性问题;也卡把差值当 key 导致溢出的写法。

一个超大区间覆盖全部 + 若干点在内部/边缘:应最终 1 段;卡“内部区间也计数”、或合并时被内部区间错误截断。

交替重叠形成多组:例如 (1,2)(3,4)(2,3) 这一组会合成 (1,4),另一组 (10,11)(12,13)(11,12) 合成 (10,13),再加单点 (20,20);卡“没有传递合并”。

很多点区间 (i,i):卡把点区间当空区间忽略、或读入时 r==l 处理错。

大量小区间连续相接形成长链:应最终 1 段;卡“只合并重叠不合并端点”、或合并时右端点更新错导致断开。

大量完全不相交(间隔固定):应输出 n;卡误把“间隔 1/2”也当成相交、或判定写成 l <= curR + 1 之类(把相邻但不相交也合并了)。

靠一个大区间桥接把多段连起来:(1,2)(4,5)(7,8)(2,7) 应合成 1 段;卡只合并相邻区间、或没正确更新后续可合并范围。

专卡 l<curR vs l<=curR 的混合:(1,1)(2,2)(1,2) 应合成 1 段;卡错误比较导致分裂。

只有端点“相邻但不相交”的点区间:(1,1)(2,2) 应输出 2;卡把“相邻”当“相交”(写成 l <= curR+1 的那类)。

重复端点 + 乱序 + 多组合并:如 (1,2)(2,2)(2,3)(3,3) 要合并成 (1,3),以及 (9,10)(10,10) 要合并;卡排序、以及右端点更新与计数错位。

n=1000 中等规模随机(含大量局部重叠与跳跃):综合正确性 + 性能;卡 O(n^2) 扫描/每次找能合并的区间导致慢。

n=100000 压力:全部链式相交((i,i+1)):应输出 1;强卡性能与端点合并规则(<=)。

n=100000 压力:全部不相交((2i,2i)):应输出 100000;卡误合并/性能/输出整型范围。

n=100000 压力:大范围随机区间(长度 0..1000,l 在 [-1e9,1e9]):综合强测;卡排序+合并的总体性能与各种边界组合(点区间/短区间/重叠概率高)。