#23. 区间分组
区间分组
给定 个闭区间 ,请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。
输出最小组数。
输入格式
第一行包含整数 ,表示区间数。
接下来 行,每行包含两个整数 ,表示一个区间的两个端点。
输出格式
输出一个整数,表示最小组数。
数据范围
,
输入样例:
3
-1 1
2 4
3 5
输出样例:
2
下面按 k=1..25 说明这套“区间最少分组(组内两两不相交,端点也算相交)”分别在卡哪些常见错误做法。
(正确思路:按 左端点升序 排序,用小根堆维护每组当前的最小结束点;若 a > minEnd 才能复用该组,否则新开组。最终答案=堆最大尺寸=最大重叠数。)
- 样例:基础正确性(既有可同组也有必须分组的重叠)。
- 单点区间
[0,0]:卡初始化/边界(别输出 0)。 - 全互不相交(相隔开):答案应为 1;卡把“分组”误以为“每个区间一组/或错误计算重叠”。
- 端点相接
[1,2]与[2,3]:端点也算相交 ⇒ 必须 2 组;专卡把条件写成a >= end(会误复用导致输出 1)。 - 端点相接长链
(1,2)(2,3)...(5,6):最少组数应为 2(像给路径染色);卡>=、以及错误认为“链式就要很多组”。 - 全部完全相同区间:答案=N;卡去重/只看端点集合/错误认为相同可放同组。
- 严格嵌套
(1,10)(2,9)...(5,6):答案=嵌套层数(这里 5);卡只看相邻/只会合并成 1 组、或没用堆导致算错最大重叠。 - 混合重叠 + 端点相接:例如
(2,5)与(5,7)在 5 相交;卡端点规则、以及堆复用逻辑错误。 - 负数区间多重重叠:卡负数排序/比较错误,或用减法比较溢出(某些语言/写法)。
- 跨 0 + 多处端点相接:
(-3,0),(0,2),(2,4),(1,3);卡端点相交、以及“先结束的组应优先复用”的堆策略。 - 乱序输入:必须排序;卡按输入顺序分组会错。
- 相同左端点不同右端点:答案=数量(全部在起点处重叠);卡只按右端点排序/或错误把同起点当可串起来。
- 相同右端点不同左端点(含
[5,5]点区间):右端点处全部重叠 ⇒ 组数大;卡点区间处理、端点相交。 - 大量相同点区间
[7,7]:答案=N;强卡点区间(很多人把点区间当“长度 0 可忽略”)。 - 专卡
>=复用错误 + 点区间混合:(1,1),(1,2),(2,2)在 1 和 2 都有端点相交,最少应为 2;若用a >= end会误复用导致 1 或其它错值。 - 极值不相交
(-1e9,-1e9),(0,0),(1e9,1e9):答案 1;卡边界/排序/溢出。 - 超大区间覆盖全局 + 多个不同点区间:最少应为 2(大区间与任意一个点区间冲突,但点区间彼此不冲突);卡误以为“覆盖全局”导致需要很多组。
- “阶梯式”重叠(含端点)
(1,3)(2,4)(3,5)(4,6)(5,7):最大同时重叠数是 3(在 3、4、5 处都能达到);卡只看严格重叠不看端点、或复用条件写错。 - 明确深度 4 的嵌套 + 远处独立段:前四个形成 4 重叠,
(11,12)独立;卡把独立段也算进重叠、或最大值更新错。 - 小规模随机(含负数/点区间/短区间):综合正确性,卡各种组合 bug。
- N=1000:100 组互不相交的“块”,每块内 10 条都重叠:答案应为 10;卡错误地把不同块叠加(没排序/没正确复用)导致 >10。
- N=100000:全部不相交点区间:答案 1;强卡性能(O(N^2) 会炸)与堆实现正确性。
- N=100000:全部相同大区间:答案 100000;强卡性能 + 任何“去重/合并”式错误。
- N=100000:端点相接链
[i,i+1]:答案 2;强卡a > end还是a >= end的区别(用>=会错误输出 1)。 - N=100000:随机大范围短区间:综合强测(排序 + 堆复用 + 性能 + 边界)。
如果你想更“针对性”地卡某个错误实现(比如:用最大堆、或每次找可复用组用线性扫描、或把端点当不相交),把那种错误写法描述一下,我可以再补几组更尖锐的反例。