1.题目描述
2.思路
将传入的区间范围排序,不同区间存在三种情况,第一种,维护区间和枚举区间有交集,比如维护区间范围[1,3],枚举区间范围[2,4],此时将两区间合并为[1,4],即将维护区间的ed更新为枚举区间的en。第二种,维护区间[1,3],枚举区间[1,2],此时维护区间不变,继续枚举下一个区间。第三种,维护区间与枚举区间无交集,维护区间[1,3],枚举区间[4,5],此时将维护区间写入保存数据的vector向量中,枚举区间变成新的维护区间,并与下一个枚举区间做操作,如果此时新的维护区间为最后一个区间,则将该区间写入向量中。
3.一些细节
1.进入merge函数时st,ed为初始边界,无限长,设为-2e9,进用作第一次边界更新时作比较使用,输入数据一定符合此时的边界范围。
2.第一次进入merge函数的for循环是为了更新区间,将无限长的区间更新为第一个维护区间,之后与下一个枚举区间比较。第一次迭代,更新区间;之后迭代,与更新的区间作操作。迭代完成后总会剩余一个最后的区间,需要将将此区间读入向量中。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef pair<int, int>PII;
const int N = 100010;
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 it : segs)//某一时刻只维护一个区间[st,ed]
{
if (it.first > ed)
{
if (st != -2e9) res.push_back({ st,ed });//没有交集,直接往向量读入
st = it.first, ed = it.second;//更新区间
}
else ed = max(ed, it.second);//有交集,将区间ed更新为长的那一个
}
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 });
}
merge(segs);
cout << segs.size() << endl;
return 0;
}