AcWing 803. 区间合并
原题链接
简单
作者:
满目星河_0
,
2021-03-31 12:26:01
,
所有人可见
,
阅读 196
带注释(超详细)
//算法思想:1.首先按照左端点的大小对区间进行排序。
//2.遍历所有的区间,分情况进行讨论下一个区间的可能情况。
/////分三种可能的情况:第一种:新加入的区间属于原来的区间,区间不改变
//第二种:新加入的区间的起点在上一个区间内,终点比前一个区间的终点更远。
//第三种:新加入区间的起点在前一个区间的终点后边。
/////////前两种情况只需要改变当前维护的区间的终点,第三种情况需要开始维护新的区间。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<int ,int> Pll;
vector<Pll> num; //用来存储区间
void merge(vector<Pll> &num){ //传进来的必须是引用,因为要对num进行修改
vector<Pll> res; //用来存储结果
sort(num.begin(),num.end()); //排序
int st=-2e9,ed=-2e9; //用来表示起始和终止
for(auto seg:num){
if(ed<seg.first){ //第3种情况
if(st!=-2e9) //第一个区间可能不能加入res中
res.push_back({st,ed}); //将前面这个区间加入到res
st=seg.first; //开始维护新的区间
ed=seg.second;
}
else ed=max(ed,seg.second); //第1,2种情况
}
if(st!=-2e9) //如果输入的区间是空区间的情况。
res.push_back({st,ed});
num=res;
}
int main(){
int n;
cin>>n;
int l,r;
for(int i=0;i<n;i++) {
cin>>l>>r;
num.push_back({l,r});
}
merge(num);
cout<<num.size();
return 0;
}