#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
int merge(vector<PII> &segs)
{
if (segs.size() == 0) return 0;
vector<PII> res_segs;
// st和ed维护当前区间; for循环遍历的是下一个区间
int st = segs[0].first, ed = segs[0].second;
for (int i = 1; i < segs.size(); i ++ )
{
// 如果当前区间的ed大于等于下一区间的右端点,更新当前维护区间的右端点
if (ed >= segs[i].first) ed = max(ed, segs[i].second);
else // 否则将当前区间加入结果集中,并维护下一新区间
{
res_segs.push_back({st, ed});
st = segs[i].first, ed = segs[i].second;
}
}
// 将最后一个区间加入结果集中
res_segs.push_back({st, ed});
return res_segs.size();
}
int main()
{
int n;
cin >> n;
vector<PII> segs;
// 把所有区间以pair的形式存在数组中
while (n -- )
{
int l, r;
cin >> l >> r;
segs.push_back({l, r});
}
// 先将所有区间排序
sort(segs.begin(), segs.end());
// 合并区间,得到区间个数
int res = merge(segs);
cout << res << endl;
return 0;
}
算法板子:合并区间
于 2023-03-01 10:50:11 首次发布