#23. 区间分组

区间分组

给定 NN 个闭区间 [ai,bi][a_i,b_i],请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。

输出最小组数。

输入格式

第一行包含整数 NN,表示区间数。

接下来 NN 行,每行包含两个整数 ai,bia_i,b_i,表示一个区间的两个端点。

输出格式

输出一个整数,表示最小组数。

数据范围

1N1051 \le N \le 10^5,
109aibi109-10^9 \le a_i \le b_i \le 10^9

输入样例:

3
-1 1
2 4
3 5

输出样例:

2

下面按 k=1..25 说明这套“区间最少分组(组内两两不相交,端点也算相交)”分别在卡哪些常见错误做法。 (正确思路:按 左端点升序 排序,用小根堆维护每组当前的最小结束点;若 a > minEnd 才能复用该组,否则新开组。最终答案=堆最大尺寸=最大重叠数。)

  1. 样例:基础正确性(既有可同组也有必须分组的重叠)。
  2. 单点区间 [0,0]:卡初始化/边界(别输出 0)。
  3. 全互不相交(相隔开):答案应为 1;卡把“分组”误以为“每个区间一组/或错误计算重叠”。
  4. 端点相接 [1,2][2,3]:端点也算相交 ⇒ 必须 2 组;专卡把条件写成 a >= end(会误复用导致输出 1)。
  5. 端点相接长链 (1,2)(2,3)...(5,6):最少组数应为 2(像给路径染色);卡 >=、以及错误认为“链式就要很多组”。
  6. 全部完全相同区间:答案=N;卡去重/只看端点集合/错误认为相同可放同组。
  7. 严格嵌套 (1,10)(2,9)...(5,6):答案=嵌套层数(这里 5);卡只看相邻/只会合并成 1 组、或没用堆导致算错最大重叠。
  8. 混合重叠 + 端点相接:例如 (2,5)(5,7) 在 5 相交;卡端点规则、以及堆复用逻辑错误。
  9. 负数区间多重重叠:卡负数排序/比较错误,或用减法比较溢出(某些语言/写法)。
  10. 跨 0 + 多处端点相接(-3,0),(0,2),(2,4),(1,3);卡端点相交、以及“先结束的组应优先复用”的堆策略。
  11. 乱序输入:必须排序;卡按输入顺序分组会错。
  12. 相同左端点不同右端点:答案=数量(全部在起点处重叠);卡只按右端点排序/或错误把同起点当可串起来。
  13. 相同右端点不同左端点(含 [5,5] 点区间):右端点处全部重叠 ⇒ 组数大;卡点区间处理、端点相交。
  14. 大量相同点区间 [7,7]:答案=N;强卡点区间(很多人把点区间当“长度 0 可忽略”)。
  15. 专卡 >= 复用错误 + 点区间混合(1,1),(1,2),(2,2) 在 1 和 2 都有端点相交,最少应为 2;若用 a >= end 会误复用导致 1 或其它错值。
  16. 极值不相交 (-1e9,-1e9),(0,0),(1e9,1e9):答案 1;卡边界/排序/溢出。
  17. 超大区间覆盖全局 + 多个不同点区间:最少应为 2(大区间与任意一个点区间冲突,但点区间彼此不冲突);卡误以为“覆盖全局”导致需要很多组。
  18. “阶梯式”重叠(含端点) (1,3)(2,4)(3,5)(4,6)(5,7):最大同时重叠数是 3(在 3、4、5 处都能达到);卡只看严格重叠不看端点、或复用条件写错。
  19. 明确深度 4 的嵌套 + 远处独立段:前四个形成 4 重叠,(11,12) 独立;卡把独立段也算进重叠、或最大值更新错。
  20. 小规模随机(含负数/点区间/短区间):综合正确性,卡各种组合 bug。
  21. N=1000:100 组互不相交的“块”,每块内 10 条都重叠:答案应为 10;卡错误地把不同块叠加(没排序/没正确复用)导致 >10。
  22. N=100000:全部不相交点区间:答案 1;强卡性能(O(N^2) 会炸)与堆实现正确性。
  23. N=100000:全部相同大区间:答案 100000;强卡性能 + 任何“去重/合并”式错误。
  24. N=100000:端点相接链 [i,i+1]:答案 2;强卡 a > end 还是 a >= end 的区别(用 >= 会错误输出 1)。
  25. N=100000:随机大范围短区间:综合强测(排序 + 堆复用 + 性能 + 边界)。

如果你想更“针对性”地卡某个错误实现(比如:用最大堆、或每次找可复用组用线性扫描、或把端点当不相交),把那种错误写法描述一下,我可以再补几组更尖锐的反例。