茂名网站开发公司,北京网站优化方式,中国电信六大外包公司,docker wordpress安装目录题目描述
给定 n 个区间 [li, ri]#xff0c;要求合并所有有交集的区间。注意如果在端点处相交#xff0c;也算有交集。 输出合并完成后的区间个数。 例如#xff1a;[1, 3] 和 [2, 6] 可以合并为一个区间 [1, 6]。
输入格式
第一行包含整数 n 。 接下来 n 行#xff0c…题目描述
给定 n 个区间 [li, ri]要求合并所有有交集的区间。注意如果在端点处相交也算有交集。 输出合并完成后的区间个数。 例如[1, 3] 和 [2, 6] 可以合并为一个区间 [1, 6]。
输入格式
第一行包含整数 n 。 接下来 n 行每行包含两个整数 l 和 r。第 i 行的两个数据表示 li, ri。
输出格式
共一行包含一个整数表示合并区间完成后的区间个数。
数据范围
1≤n≤100,000
−10^9≤li≤ri≤10^9
输入样例
5
1 2
2 4
5 6
7 8
7 9输出样例
3注释版代码
//http://47.110.135.197/problem.php?id5240
#includeiostream
#includealgorithm
#includevector
using namespace std;
typedef pairint,int PII;
vectorPII segs;
vectorPII res;//res用于存放合并完的区间
void merge(vectorPII segs)
{sort(segs.begin(),segs.end());//先对区间进行排序pair排序是按照左断点先排序再按照右端点排序int st-2e9,ed-2e9;//将st和ed定义为极限小因为题目的数据范围是10^9所以定义极限小可以定义2e9for(auto seg:segs){//对于两区间之间的关系有两种情况//①前面区间与后面区间没有交集那么没有交集就说明前面区间已经不能与后面区间合并//那么前面的区间就已经不能再合并了可以放入结果集了if(edseg.first)//这样定义ed-2e9就可以保证第一个有效区间能进行操作{if(st!-2e9)//只要他不是我们取的无限小就可以放入结果集了{res.push_back({st,ed});}stseg.first,edseg.second;//然后更新st为后面区间的l和r}//②前面区间与后面区间有交集那么我们只需要把ed更新为前面区间和后面区间相比较大的右端点就可以了else edmax(ed,seg.second);}if(st!-2e9) res.push_back({st,ed});//如果只有一个区间我们就需要用到这个步骤
}
int main()
{int n,l,r;scanf(%d,n);for(int i0;in;i){scanf(%d %d,l,r);segs.push_back({l,r});//将每一个lr代表的区间存入segs里面}merge(segs);//对segs区间进行合并操作printf(%d,res.size());//输出合并完的区间个数return 0;
}