一个数字段由首尾两个数字标识,表示一个自然数集合,比如数字段[beg, end)表示从beg到end之间的所有自然数,包含beg,但不包含end。
有若干个数字段,这些数字段之间可能有重叠,
怎么把这些数字段合并去重,用最少个数的数字段来表示。
合并前后,整个集合包含的数字不发生变化。
输入描述:
第一行为数字N,表示接下来有N个数字段(N<=100000)
第二行开始一共有N行,每行两个数字,分别表示一个数字段的beg和end
(beg和end为无符号32位整数)
输出描述:
合并去重后形成的数字段集合,按升序排列。
示例1 输入 4 3 8 3 7 4 6 7 9 输出 3 9
解题:
对数据进行排序,按照first从小到大,first相等时second从小到大,
这样,只需要判断前一个区间的second与后一个区间的first之间的关系即可。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
using Pair = pair<int,int>;
bool comp(Pair a, Pair b){
return (a.first!=b.first)?(a.first<b.first):(a.second<=b.second);
}
vector<Pair> v;
vector<Pair> ans;
int main(){
int n,x,y;
cin>>n;
while(n--){
cin>>x>>y;
v.push_back(make_pair(x,y));
}
sort(v.begin(), v.end(), comp);
int k=-1;
for(auto i : v){
if(k>=0 && i.first<=ans[k].second)
ans[k].second=max(i.second,ans[k].second);
else{
ans.push_back(i);
k++;
}
}
for(auto i : ans)
cout<<i.first<<' '<<i.second<<endl;
return 0;
}
京公网安备 11010502036488号