区间合并
⚠️点
1. merge函数中,传入的是segs的引用
2. st,ed初始化为负无穷,表示上一个区间。每次判断当前区间和上一个区间是否有交集,无则将上一个区间放入res中,当前区间成为新的上一个区间
3. 因此,最后一个区间判断时,要么与上一个区间合并到一起了,要么是上一个区间添加了,但是当前这个区间成为了一个新的区间。两种情况下,最后一个区间都没有被添加到res中,因此需要判断并添加
/#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;
typedef pair<int, int> PII;
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(ed, seg.second); //有交集,找右端点的最大值
}
if (ed != -2e9) res.push_back({st, ed}); //⚠️
segs = res;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int l, r;
scanf("%d%d", &l, &r);
segs.push_back({l, r});
}
merge(segs);
cout << segs.size() << endl;
return 0;
}