sort
定义在<algorithm>
头文件
INT_MIN
,定义在<climits>
头文件
res.push_back({st,ed});
的逻辑是seg的这组区间和上一组的出现了区间断层!
比如上组是[1,4],下一组是[5,6],st=1,ed=4
,seg=[5,6]
,则
e
d
<
s
e
g
.
f
i
r
s
t
ed \lt seg.first
ed<seg.first是可以直接res.push_back({st,ed});
的!因为出现了区间断层!直接保存res即可!
#include<iostream>
#include<vector>
#include<algorithm>
#include<climits>
using namespace std;
typedef pair<int,int> PII;
vector<PII> res,segs;
void merage(vector<PII>& segs){
int st=INT_MIN,ed=INT_MIN;
sort(segs.begin(),segs.end());
for(auto seg:segs){
if(ed<seg.first){
if(st!=INT_MIN){
res.push_back({st,ed});
}
st=seg.first,ed=seg.second;
}else{
ed=max(ed,seg.second);
}
}
if(st!=INT_MIN) res.push_back({st,ed});//这一行是必要的
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;++i){
int l,r;
cin>>l>>r;
segs.push_back({l,r});
}
merage(segs);
cout<<res.size()<<endl;
return 0;
}
if(st!=INT_MIN) res.push_back({st,ed});
代码的缺失,会导致如下用例不通过!这个用例的情况是排序完了之后,进行区间合并时直接合并到了Lmin和Rmax,但是还没有放到res结果数组里面,然后一直
e
d
≥
s
e
g
.
f
i
r
s
t
ed \ge seg.first
ed≥seg.first,而不是ed<seg.first
,导致一直无法保存res数组。
10
-15 -8
-20 23
-2 11
2 22
18 23
11 27
-8 21
-18 14
-17 -12
-23 8