算法标签:贪心 区间和并
题目简叙
思路
合并区间可能遇到以下的三种状态:
我们维护了一个区间来进行判定我们每次可以维护的长度
lens(start,end)
如果是状态1:lens不发生改变
如果是状态2:lens中的end进行更新扩展
else end = max(end,item.second);//状态1 维护并延长区间
如果是状态3:保存lens的状态,同时lens更新,lens.count++
if(end<item.first){//状态2 更新到新的区间
if(end!=LMax){//如果不是初始化
tmpArr.push_back({start,end});//这里的时候 表示我们到了一个新的区间 所以压入上一段区间
}
start = item.first;
end = item.second;
}
如果我们实际进行处理:
代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 100000+10;
const int LMax = -2e9;
typedef pair<int,int>PII;
vector<PII>arr;
vector<PII>tmpArr;
void merge(vector<PII> &arr){
sort(arr.begin(),arr.end());
int start = LMax,end = LMax;//维护的区间
for(auto item:arr){
if(end<item.first){//状态2 更新到新的区间
if(end!=LMax){//如果不是初始化
tmpArr.push_back({start,end});//这里的时候 表示我们到了一个新的区间 所以压入上一段区间
}
start = item.first;
end = item.second;
}
else end = max(end,item.second);//状态1 维护并延长区间
}
if(start!=LMax)tmpArr.push_back({start,end});//放入末尾最后的一个区间,
arr = tmpArr;//覆盖
}
int main(){
int n;
int l,r;
cin>>n;
while(n--){cin>>l>>r;arr.push_back({l,r});}
merge(arr);
cout<<arr.size();
return 0;
}