#22. 最大不相交区间数量

最大不相交区间数量

给定 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 > last_end,注意不是 >=。)

  1. 样例:基础正确性(有重叠也有可选的)。
  2. 单点区间 [0,0]:卡边界/初始化(别输出 0)。
  3. 全都互相重叠(嵌套):答案应为 1;卡把“尽量多选”写成乱选/没用贪心。
  4. 完全不相交(点区间):答案=N;卡误判不相交、或覆盖条件写错导致少选。
  5. 端点相接不可同时选 [1,2][2,3]:专卡把条件写成 a >= last_end(会错误认为可以同时选)。
  6. 端点相接链 (1,2)(2,3)(3,4)(4,5)(5,6):最优应选 3 个(隔一个选一个);卡端点规则/选择策略错误。
  7. 大量重复同一区间:答案 1;卡重复计数(可能错误输出 20)。
  8. 大区间+多个互不相交小区间+远处区间:应倾向选多个小区间而不是选大区间;卡“选最长/选最早开始”等错误贪心。
  9. 负数段 + 混合(含嵌套/独立):卡负数比较/排序错误。
  10. 乱序输入 + 重叠/端点相接混合:必须排序;卡按输入顺序选。
  11. 专卡错误策略:先选大区间/按长度/按左端点 (1,10),(2,3),(4,5),(6,7):正确应选 3 个小的;若先选 (1,10) 会只得到 1。
  12. 专卡“按左端点排序然后贪心选” (1,2),(3,4),(0,10):正确是选两个小的=2;左端点贪心可能先拿 (0,10) 变成 1。
  13. 相同右端点/点区间混合:考察 tie 处理 + 端点相交规则;卡排序 tie 写错或选取判断混乱(尤其把 [3,3] 当成可与 [1,3] 共存的错误)。
  14. 专卡 >= 错误(端点相交算冲突) (1,1)(1,2):若先选 (1,1),后者起点=1 与 last_end=1 相接,不能再选;答案 1。用 >= 会错选成 2。
  15. 点区间插在端点上 (1,2),(2,2),(3,3)(1,2)(2,2) 冲突;最优是选 (2,2)(3,3) 共 2;卡把点区间当“可贴边”。
  16. 极值点区间(-1e9 等):卡比较/排序溢出、以及边界处理。
  17. 超大区间跨越全部 vs 多个小区间:正确应选多个小区间(而不是选跨越全部的大区间);卡“选覆盖范围最大”这种错贪心。
  18. 大量点区间 + 重复 + 端点相同:卡对重复/点区间的处理、以及端点冲突判断。
  19. 小规模随机(含负数):综合正确性(各种重叠/嵌套/点区间组合)。
  20. N=1000:100 组“组内互相重叠、组间完全分离”:答案应为 100;卡错误贪心/排序问题导致偏离。
  21. N=100000:全不相交点区间:答案 100000;强卡性能(O(N^2) 会炸)与 I/O。
  22. N=100000:全相同大区间:答案 1;强卡性能 + 重复处理。
  23. N=100000:连续端点相接链 [i,i+1]:最优约 50000;强卡端点规则(若误用 >= 会得到 100000)。
  24. N=100000:随机大范围短区间:综合强测(排序+贪心正确性与性能)。
  25. 专卡比较器用减法导致 32 位溢出(极值组合 + 超大区间 + 点区间):若比较函数写 return r1-r2 等可能溢出,排序乱掉从而选取数量错误。

如果你希望我也像前几题那样“再补一份专门针对某类错误代码”的小包(比如:只卡 >=、只卡按左端点排序、只卡长度贪心),告诉我你最担心的错误写法,我可以加更尖锐的反例。