
题目如上图所示,我们需要把若干个有交集的区间进行合并。那么凡是区间都有左右两个端点。我们先将所有区间的左端点进行排序,那么两个区间之间无非就是三种情况,第一种:第二个区间全部包含在第一个区间内。第二种:第二个区间部分包含在第一个区间内。第三种:第二个区间在第一个区间之外。
这里我们把区间的左端点叫做st,右端点叫做end.这里我们先把我们的主函数写一下.
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<int,int> pii;
vector<pii>ans;
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
int l,r;
cin>>l>>r;
ans.push_back({l,r});
}
merge_(ans)
cout<<ans.size()<<endl;
return 0;
}
主函数里面的merge_函数就是我们用来合并区间所用的函数。
merge_(vector<pii>&ans)
{
vector<pii>qus;
sort(ans.begin(),ans.end());//sort优先按照pair里面的左端点进行排序
int st=-2e9;
int end=-2e9;//初始区间为负无穷,然后进行区间的维护即可
//然后开始讨论三种情况,实际是两种情况
for(auto temp:ans){
if(end<temp.first){
if(st!=-2e9)qus.push_back({st,end});
st=temp.first;
end=temp.second;
}
else{
end=max(end,temp.second);
}
if(st!=-2e9)qus.push_back({st,end});
ans=qus;
上面说的第一种和第二种情况我们就可以比较当前维护的区间的end和下一个区间的second哪个更大的话维护区间的end就变为更大的那个,第三种情况就是不用维护当前区间了直接装入答案即可,进入下一个区间.
该博客探讨了如何使用C++解决区间合并的问题。通过首先对所有区间的左端点进行排序,然后根据区间间的关系(完全包含、部分包含或不包含)来决定合并策略。在主函数中调用merge_函数进行合并操作,根据比较区间end的大小来更新维护的区间。
2083

被折叠的 条评论
为什么被折叠?



