快速把 n 个有交集的区间合并,输出合并后的区间个数。

思路:

  1. 按区间左端点排序。
  2. 维护一个当前区间。遍历所有区间,动态更新当前区间左右端点的值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef pair<int,int> PII;
const int N = 100010;
int n;
vector<PII> segs;
void merge (vector<PII>& segs) {
vector<PII> res;
sort(segs.begin(), segs.end());
int st=-2e9, ed = -2e9;
for(auto seg: segs) {
if(ed<seg.first) {
if(st!=-2e9) {
res.push_back({st,ed});
}
st=seg.first;
ed=seg.second;
} else {
ed=max(seg.second, ed);
}
}
if(st!=-2e9) res.push_back({st,ed});
segs =res;
}
int main() {
cin >> n;
for(int i=0;i<n;i++) {
int l,r;
cin >> l >> r;
segs.push_back({l,r});
}
merge(segs);
cout << segs.size() << endl;
return 0;
}