803.区间合并
给定 n 个区间 [li,ri],要求合并所有有交集的区间。
注意如果在端点处相交,也算有交集。
输出合并完成后的区间个数。
例如:[1,3]和[2,6]可以合并为一个区间[1,6]。
输入格式
第一行包含整数n。
接下来n行,每行包含两个整数 l 和 r。
输出格式
共一行,包含一个整数,表示合并区间完成后的区间个数。
数据范围
1≤n≤100000,
−
1
0
9
−10^9
−109≤li≤ri≤
1
0
9
10^9
109
输入样例:
5
1 2
2 4
5 6
7 8
7 9
输出样例:
3
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<int,int> PII;
vector<PII> regs;
void merge(vector<PII> ®s)
{
vector<PII> res;
int st,ed=-1e9;
for(auto reg:regs)
{
if(reg.first>ed)
{
if(ed!=-1e9) res.push_back({st,ed});
st=reg.first,ed=reg.second;
}
else
{
ed=max(ed,reg.second);
}
}
if(ed!=-1e9) res.push_back({st,ed});
regs=res;
}
int main()
{
int n;
cin>>n;
while(n--)
{
int l,r;
cin>>l>>r;
regs.push_back({l,r});
}
sort(regs.begin(),regs.end());
merge(regs);
cout<<regs.size();
}
对于区间,单个区间用pair<int,int> PII存,多个用vector存。
首先,要对所给区间按照开始位置由小到大进行排序。然后对于从前到后每个区间,将其开头与ed比较,如果比ed大并且此时ed!=-1e9,那么将{st,ed}加入到结果数组res中并更新st,ed;否则将ed进行更新。然后判断如果ed!=-1e9,那么将{st,ed}加入。最后输出res的长度即可。