/*
给定 n 个区间 [li,ri],要求合并所有有交集的区间。
注意如果在端点处相交,也算有交集。
输出合并完成后的区间个数。
例如:[1,3]和[2,6]可以合并为一个区间[1,6]。
*/
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<pair<int, int>> A;
int n;
void merge(vector<pair<int, int>>& B)
{
vector<pair<int, int>> Res;
int st = -2e9, ed = -2e9; // 方便比较的过程
for (auto it : B)
{
if (ed < it.first) // 不可以合并的情况
{
if(st != -2e9) // 没有这个判定的话就会把最开始的初始区间也给压入
Res.push_back({ st,ed });
st = it.first;
ed = it.second;
}
else // 可以合并的情况 包括区间端点重合和区间完全包含这两种情况
{
ed = max(ed, it.second);
}
}
if (st != -2e9) Res.push_back({ st,ed }); // 用来存入最后一组区间端点
//比如样例中的
/* 5
1 2
2 4
5 6
7 8
7 9 最后一个7 9 可以和7 8 进行合并但是程序只是将现在的区间的ed改为了9而没有将7 9这组区间压入vector中
*/
B = Res;
}
int main(void)
{
cin >> n;
for (int i = 0; i < n; i++)
{
int l, r;
cin >> l >> r;
A.push_back({ l,r });
}
sort(A.begin(), A.end()); // sort函数对pair类型的对象进行排序操作,默认是先对第一个first进行排序
merge(A);
cout << endl;
/*for (auto it : A)
{
cout << it.first << " " << it.second << endl;
}*/
cout<<A.size()<<endl;
return 0;
}
区间合并模板
最新推荐文章于 2023-07-15 12:13:01 发布