复习知识:
1.pair 默认对first升序,当first相同时对second升序;
类模板:template <class T1, class T2> struct pair
参数:T1是第一个值的数据类型,T2是第二个值的数据类型。
功能:pair将一对值组合成一个值,这一对值可以具有不同的数据类型(T1和T2),两个值可以分别用pair的两个公有函数first和second访问。
pair详解参考以下笔记:
http://t.csdnimg.cn/TZkgmhttp://t.csdnimg.cn/TZkgm
2.c++对一组pair数据进行排序:
首先将这些数据存在 vector 数组中,vector<pair<int,int>>vec;
然后使用 sort 函数对数组进行排序,这里就涉及到了 sort 函数的使用了。
sort参数解释:(通常)
(1)第一个是要排序的数组的起始地址。
(2)第二个是结束的地址(最后一位要排序的地址的下一地址)。
(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。可以根据自己的需求自定义第三个参数cmp函数.
3.auto关键字和for循环使用
编程时常常需要把表达式的值赋给变量,这就要求在声明变量的时候清楚地知道表达式的类型。C++中。的auto关键字是一个类型说明符,通过变量的初始值或者表达式中参与运算的数据类型来推断变量的类型。C++11新标准引入了auto 类型说明符,让编译器去分析表达式的类型。和原来那些只对应一种特定类型的说明符(比如double)不同,auto让编译器通过初始值来推算变量的类型。显然,auto定义的变量必须有初始值(与C语言中的auto定义变量不一样)
在for循环中,for(auto a:b)与for(auto &a:b)区别如下:
for(auto a:b)中b为一个容器,效果是利用a遍历并获得b容器中的每一个值,但是a无法影响到b容器中的元素。
for(auto &a:b)中加了引用符号,可以对容器中的内容进行赋值,即可通过对a赋值来做到容器b的内容填充。
本题思路:
1、将每个区间按左端点从小到大进行排序
2、最开始维护的区间为空,设置端点为无穷小,遍历容器。如果当前维护区间与遍历到的区间无交集,若是新的区间就加入。更新当前维护区间。若有交集,右端点更新成较大值。
3.把最后的区间加入。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;// 因为有左右端点,故使用pair存储
void merge(vector<PII> &segs)
{
vector<PII> res;// 用res记录合并后的区间,这样不会改变segs数组的内容
sort(segs.begin(), segs.end());
int st = -2e9, ed = -2e9;// 最开始没有维护任何区间,所以左右端点都是无穷小
for (auto seg : segs)
if (ed < seg.first)// 无交集的情况
{
if (st != -2e9) res.push_back({st, ed}); // 加入答案
st = seg.first, ed = seg.second;// 更新左右端点
}
else ed = max(ed, seg.second);// 有交集的情况(包括包含情况),右端点更新成较大的值
if (st != -2e9) res.push_back({st, ed});// 把最后的区间加入答案,防止区间为空的情况
segs = res;
}
int main()
{
int n;
scanf("%d", &n);
vector<PII> segs;
for (int i = 0; i < n; i ++ )
{
int l, r;
scanf("%d%d", &l, &r);
segs.push_back({l, r});
}
merge(segs);
cout << segs.size() << endl;
return 0;
}