区间合并
题目很好理解:
我们解决区间问题的一般思路是先排序,然后观察规律
想法
- 贪心
- 具体就是按着起点排序
- 如果前一个终点< 下一个起点。那么单独成为一个区间。更新 起点
- 如果前一个终点>= 下一个起点. max(end1,end2)。更新终点
一个区间可以表示为 [start, end]
,以便满足贪心选择性质。而对于区间合并问题,其实按 end
和 start
排序都可以,不过为了清晰起见,我们选择按 start
排序。
排序完成后:
简单来说就是这样:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<int,int>PII;
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(ed,seg.second); //有交集,则更新右端点为最大值
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;
}