一:基本思路

sort(segs.begin(), segs.end())根据segs的第一个数进行排序。
区间根据左边界排好序以后,分下面图的三种情况,本质就是两种情况。
image.png

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. int n;
  6. typedef pair<int, int> PII; //临时存储区间
  7. vector<PII> res, segs;
  8. void merge(vector<PII> &segs) { //避免拷贝构造函数的执行,占用性能
  9. sort(segs.begin(), segs.end()); //sort执行的时候根据左边界执行
  10. int st = -2e9;
  11. int ed = -2e9;
  12. for (auto seg : segs) {
  13. if (ed < seg.first) { // 图中第三种情况
  14. if (ed != -2e9) res.push_back({st, ed}); //if的存在是避免初试的st和ed被加入到res中
  15. st = seg.first;
  16. ed = seg.second;
  17. } else {
  18. ed = max(ed, seg.second);
  19. }
  20. }
  21. if (st != -2e9) res.push_back({st, ed}); // 正常情况下,最后一定是有一个区间的
  22. segs = res;
  23. }
  24. int main()
  25. {
  26. cin >> n;
  27. for (int i = 0; i < n; i++)
  28. {
  29. int l, r;
  30. cin >> l >> r;
  31. segs.push_back({l, r});
  32. }
  33. merge(segs);
  34. cout << segs.size() << endl;
  35. return 0;
  36. }