区间合并

区间合并

将有交集的区间合并为一个区间
20220110164630

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 将所有存在交集的区间合并
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(ed, seg.second); //判断区间是否为空
}

if (st != -2e9) res.push_back({st, ed});

segs = res;
}


20220110195140

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
38
39
40
41
42
43
44
45
46
47
48

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int n;
vector<pair<int, int>> segs;

// 需要注意的是能够放进答案的区间一会不能是我们定的初始区间,即if (st != -2e9)的必要性
void merge(vector<pair<int, int>> &segs)
{
vector<pair<int, int>> res;

int st = -2e9, ed = -2e9;
for (auto seg : segs)
{
int l = seg.first, r = seg.second;
if (l > ed)
{
if (st != -2e9) res.push_back({st, ed}); // 当遍历到一个没有交集的区间时要把前一个区间放进答案,但要看是不是初始值
st = l;
ed = r;
}
else ed = max(ed, r);
}
// 循环中把一个区间放进答案的条件是出现新的无交集的区间,如果本身就一个区间或者到最后一个区间,循环中肯定不会把这个区间放进答案,所以需要单独处理一下最后的一个区间
if (st != -2e9) res.push_back({st, ed}); // 因为segs中可能没有区间
segs = res;
}
int main()
{
cin >> n;
for (int i = 0; i < n; ++ i)
{
int l, r;
cin >> l >> r;
segs.push_back({l, r});
}

sort(segs.begin(), segs.end());

merge(segs);

cout << segs.size() << endl;
return 0;
}